@relayburn/mcp 1.8.0 → 1.10.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/CHANGELOG.md +7 -0
- package/dist/end-to-end.test.js +8 -35
- package/dist/end-to-end.test.js.map +1 -1
- package/dist/tools/archive-backed.test.js +1 -13
- package/dist/tools/archive-backed.test.js.map +1 -1
- package/dist/tools/session-cost.d.ts +12 -16
- package/dist/tools/session-cost.d.ts.map +1 -1
- package/dist/tools/session-cost.js +15 -71
- package/dist/tools/session-cost.js.map +1 -1
- package/dist/tools/session-cost.test.js +54 -77
- package/dist/tools/session-cost.test.js.map +1 -1
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@ All notable changes to `@relayburn/mcp`.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.9.0] - 2026-05-03
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- `burn__sessionCost` is now a thin wrapper over `@relayburn/sdk`'s new `sessionCost()` function. The wire shape is unchanged (`sessionId`, `totalUSD`, `totalTokens`, `turnCount`, `models`, `note?`); the cost computation, archive-with-fallback strategy, and pricing snapshot all live in the SDK now, eliminating the duplicate query path that previously lived inside the MCP tool.
|
|
12
|
+
- `@relayburn/mcp` now depends on `@relayburn/sdk`. The package's role going forward is "MCP-shaped wrapper over the SDK's query surface" — new tools should call SDK functions rather than re-implementing computation against `@relayburn/analyze` / `@relayburn/ledger`.
|
|
13
|
+
|
|
7
14
|
## [1.6.2] - 2026-05-02
|
|
8
15
|
|
|
9
16
|
### Changed
|
package/dist/end-to-end.test.js
CHANGED
|
@@ -3,36 +3,6 @@ import { PassThrough } from 'node:stream';
|
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
4
|
import { startStdioServer } from './server.js';
|
|
5
5
|
import { createSessionCostTool } from './tools/session-cost.js';
|
|
6
|
-
const PRICING = {
|
|
7
|
-
'claude-sonnet-4-5': {
|
|
8
|
-
input: 3,
|
|
9
|
-
output: 15,
|
|
10
|
-
cacheRead: 0.3,
|
|
11
|
-
cacheWrite: 3.75,
|
|
12
|
-
reasoningMode: 'same_as_output',
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
function turn() {
|
|
16
|
-
return {
|
|
17
|
-
v: 1,
|
|
18
|
-
source: 'claude-code',
|
|
19
|
-
sessionId: 'S',
|
|
20
|
-
messageId: 'm1',
|
|
21
|
-
turnIndex: 0,
|
|
22
|
-
ts: '2026-04-24T10:00:00.000Z',
|
|
23
|
-
model: 'claude-sonnet-4-5',
|
|
24
|
-
usage: {
|
|
25
|
-
input: 1_000_000,
|
|
26
|
-
output: 0,
|
|
27
|
-
reasoning: 0,
|
|
28
|
-
cacheRead: 0,
|
|
29
|
-
cacheCreate5m: 0,
|
|
30
|
-
cacheCreate1h: 0,
|
|
31
|
-
},
|
|
32
|
-
toolCalls: [],
|
|
33
|
-
enrichment: {},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
6
|
function collectResponses(stream) {
|
|
37
7
|
const lines = [];
|
|
38
8
|
let buf = '';
|
|
@@ -55,14 +25,19 @@ function send(stream, msg) {
|
|
|
55
25
|
stream.write(JSON.stringify(msg) + '\n');
|
|
56
26
|
}
|
|
57
27
|
describe('end-to-end: spawn server, call burn__sessionCost, verify cost', () => {
|
|
58
|
-
it('returns the same
|
|
28
|
+
it('returns the same totals the SDK sessionCost would produce', async () => {
|
|
59
29
|
const input = new PassThrough();
|
|
60
30
|
const output = new PassThrough();
|
|
61
31
|
const responses = collectResponses(output);
|
|
62
32
|
const sessionCost = createSessionCostTool({
|
|
63
33
|
defaultSessionId: 'S',
|
|
64
|
-
|
|
65
|
-
|
|
34
|
+
sessionCost: async (opts) => ({
|
|
35
|
+
sessionId: opts.session ?? null,
|
|
36
|
+
totalUSD: 3,
|
|
37
|
+
totalTokens: 1_000_000,
|
|
38
|
+
turnCount: 1,
|
|
39
|
+
models: ['claude-sonnet-4-5'],
|
|
40
|
+
}),
|
|
66
41
|
});
|
|
67
42
|
const server = startStdioServer({
|
|
68
43
|
name: '@relayburn/mcp',
|
|
@@ -94,8 +69,6 @@ describe('end-to-end: spawn server, call burn__sessionCost, verify cost', () =>
|
|
|
94
69
|
assert.ok(callResp.result, 'tool call returned a result');
|
|
95
70
|
const text = callResp.result.content[0].text;
|
|
96
71
|
const parsed = JSON.parse(text);
|
|
97
|
-
// 1M input @ $3/M = $3, matching what `burn summary --session S` would
|
|
98
|
-
// report for the same turns and pricing.
|
|
99
72
|
assert.equal(parsed.totalUSD, 3);
|
|
100
73
|
assert.equal(parsed.turnCount, 1);
|
|
101
74
|
assert.equal(parsed.sessionId, 'S');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"end-to-end.test.js","sourceRoot":"","sources":["../src/end-to-end.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"end-to-end.test.js","sourceRoot":"","sources":["../src/end-to-end.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,15 +30,6 @@ function fakeTurn(overrides = {}) {
|
|
|
30
30
|
...overrides,
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
const PRICING_LOADER = async () => ({
|
|
34
|
-
'claude-sonnet-4-5': {
|
|
35
|
-
input: 3,
|
|
36
|
-
output: 15,
|
|
37
|
-
cacheRead: 0.3,
|
|
38
|
-
cacheWrite: 3.75,
|
|
39
|
-
reasoningMode: 'same_as_output',
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
33
|
describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
43
34
|
let tmpDir;
|
|
44
35
|
const originalHome = process.env['RELAYBURN_HOME'];
|
|
@@ -82,7 +73,6 @@ describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
|
82
73
|
await buildArchive();
|
|
83
74
|
const tool = createSessionCostTool({
|
|
84
75
|
defaultSessionId: 's-cost',
|
|
85
|
-
loadPricing: PRICING_LOADER,
|
|
86
76
|
});
|
|
87
77
|
const result = (await tool.handler({}));
|
|
88
78
|
assert.equal(result.sessionId, 's-cost');
|
|
@@ -118,7 +108,6 @@ describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
|
118
108
|
]);
|
|
119
109
|
const tool = createSessionCostTool({
|
|
120
110
|
defaultSessionId: 's-cost',
|
|
121
|
-
loadPricing: PRICING_LOADER,
|
|
122
111
|
});
|
|
123
112
|
const result = (await tool.handler({}));
|
|
124
113
|
assert.equal(result.turnCount, 2);
|
|
@@ -136,7 +125,6 @@ describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
|
136
125
|
const logs = [];
|
|
137
126
|
const tool = createSessionCostTool({
|
|
138
127
|
defaultSessionId: 's-cost',
|
|
139
|
-
loadPricing: PRICING_LOADER,
|
|
140
128
|
onLog: (m) => logs.push(m),
|
|
141
129
|
});
|
|
142
130
|
const result = (await tool.handler({}));
|
|
@@ -144,7 +132,7 @@ describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
|
144
132
|
assert.equal(result.totalTokens, 1_000_000);
|
|
145
133
|
// 1M input @ $3/M = $3.
|
|
146
134
|
assert.equal(result.totalUSD, 3);
|
|
147
|
-
assert.ok(logs.some((m) => /
|
|
135
|
+
assert.ok(logs.some((m) => /archive query failed/.test(m)), `expected an archive-fallback log line, got: ${JSON.stringify(logs)}`);
|
|
148
136
|
});
|
|
149
137
|
});
|
|
150
138
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-backed.test.js","sourceRoot":"","sources":["../../src/tools/archive-backed.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,qBAAqB,EAA0B,MAAM,mBAAmB,CAAC;AAElF,6EAA6E;AAC7E,4EAA4E;AAC5E,gDAAgD;AAEhD,SAAS,QAAQ,CAAC,YAAiC,EAAE;IACnD,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,CAAC;QACZ,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,cAAc;QACvB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"archive-backed.test.js","sourceRoot":"","sources":["../../src/tools/archive-backed.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { EnrichedTurn } from '@relayburn/ledger';
|
|
1
|
+
import type { SessionCostResult as SdkSessionCostResult } from '@relayburn/sdk';
|
|
3
2
|
import type { ToolDefinition } from '../types.js';
|
|
4
3
|
export interface SessionCostInput {
|
|
5
4
|
sessionId?: string;
|
|
6
5
|
}
|
|
7
|
-
export
|
|
8
|
-
sessionId: string | null;
|
|
9
|
-
totalUSD: number;
|
|
10
|
-
totalTokens: number;
|
|
11
|
-
turnCount: number;
|
|
12
|
-
models: string[];
|
|
13
|
-
note?: string;
|
|
14
|
-
}
|
|
6
|
+
export type SessionCostResult = SdkSessionCostResult;
|
|
15
7
|
export interface SessionCostDeps {
|
|
16
8
|
defaultSessionId: string | undefined;
|
|
17
|
-
queryTurns?: (sessionId: string) => Promise<EnrichedTurn[]>;
|
|
18
|
-
loadPricing?: () => Promise<PricingTable>;
|
|
19
9
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
* Override for the SDK's `sessionCost(...)` call. Tests inject a fake to
|
|
11
|
+
* exercise the tool surface without touching the on-disk ledger.
|
|
12
|
+
*/
|
|
13
|
+
sessionCost?: (opts: {
|
|
14
|
+
session?: string;
|
|
15
|
+
onLog?: (msg: string) => void;
|
|
16
|
+
}) => Promise<SdkSessionCostResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Forwarded to `@relayburn/sdk` so archive-fallback log lines surface in
|
|
19
|
+
* whatever channel the host wired up (CLI server uses stderr).
|
|
24
20
|
*/
|
|
25
21
|
onLog?: (msg: string) => void;
|
|
26
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/tools/session-cost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/tools/session-cost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3G;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAqC3E"}
|
|
@@ -1,26 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { buildArchive, queryAll, queryTurnsFromArchive } from '@relayburn/ledger';
|
|
1
|
+
import { sessionCost as sdkSessionCost } from '@relayburn/sdk';
|
|
3
2
|
export function createSessionCostTool(deps) {
|
|
4
|
-
const
|
|
5
|
-
const queryTurns = deps.queryTurns ??
|
|
6
|
-
(async (id) => {
|
|
7
|
-
// Hooks append new turns to the JSONL ledger throughout the session,
|
|
8
|
-
// but the archive is only materialized when something explicitly calls
|
|
9
|
-
// `buildArchive`. Run an incremental build before each query so the
|
|
10
|
-
// tool reflects fresh data. The build is
|
|
11
|
-
// idempotent + cursor-driven, so it's a no-op when nothing has changed
|
|
12
|
-
// since the last call.
|
|
13
|
-
try {
|
|
14
|
-
await buildArchive();
|
|
15
|
-
return await queryTurnsFromArchive({ sessionId: id });
|
|
16
|
-
}
|
|
17
|
-
catch (err) {
|
|
18
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
19
|
-
log(`sessionCost: archive query failed, falling back to ledger walk: ${msg}`);
|
|
20
|
-
return queryAll({ sessionId: id });
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
const pricingLoader = deps.loadPricing ?? loadPricing;
|
|
3
|
+
const callSessionCost = deps.sessionCost ?? sdkSessionCost;
|
|
24
4
|
return {
|
|
25
5
|
name: 'burn__sessionCost',
|
|
26
6
|
description: 'Return the total cost (USD), token count, and turn count for a session. ' +
|
|
@@ -40,57 +20,21 @@ export function createSessionCostTool(deps) {
|
|
|
40
20
|
handler: async (raw) => {
|
|
41
21
|
const input = raw;
|
|
42
22
|
const sessionId = input.sessionId ?? deps.defaultSessionId;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
sessionId,
|
|
57
|
-
totalUSD: 0,
|
|
58
|
-
totalTokens: 0,
|
|
59
|
-
turnCount: 0,
|
|
60
|
-
models: [],
|
|
61
|
-
note: 'no turns recorded for this session yet',
|
|
62
|
-
};
|
|
23
|
+
const opts = {};
|
|
24
|
+
if (sessionId !== undefined)
|
|
25
|
+
opts.session = sessionId;
|
|
26
|
+
if (deps.onLog !== undefined)
|
|
27
|
+
opts.onLog = deps.onLog;
|
|
28
|
+
const result = await callSessionCost(opts);
|
|
29
|
+
// The SDK's "no session id" note is generic ("no session id provided");
|
|
30
|
+
// keep the more descriptive variant the MCP tool used to surface so the
|
|
31
|
+
// hint that the *server* should have been registered with one stays
|
|
32
|
+
// visible to MCP clients.
|
|
33
|
+
if (result.sessionId === null && sessionId === undefined) {
|
|
34
|
+
return { ...result, note: 'no session id provided and server was not registered with one' };
|
|
63
35
|
}
|
|
64
|
-
|
|
65
|
-
const models = new Set();
|
|
66
|
-
let totalTokens = 0;
|
|
67
|
-
const costs = [];
|
|
68
|
-
for (const t of turns) {
|
|
69
|
-
models.add(t.model);
|
|
70
|
-
const u = t.usage;
|
|
71
|
-
totalTokens +=
|
|
72
|
-
(u.input ?? 0) +
|
|
73
|
-
(u.output ?? 0) +
|
|
74
|
-
(u.reasoning ?? 0) +
|
|
75
|
-
(u.cacheRead ?? 0) +
|
|
76
|
-
(u.cacheCreate5m ?? 0) +
|
|
77
|
-
(u.cacheCreate1h ?? 0);
|
|
78
|
-
const c = costForTurn(t, pricing);
|
|
79
|
-
if (c)
|
|
80
|
-
costs.push(c);
|
|
81
|
-
}
|
|
82
|
-
const total = sumCosts(costs);
|
|
83
|
-
return {
|
|
84
|
-
sessionId,
|
|
85
|
-
totalUSD: round6(total.total),
|
|
86
|
-
totalTokens,
|
|
87
|
-
turnCount: turns.length,
|
|
88
|
-
models: [...models].sort(),
|
|
89
|
-
};
|
|
36
|
+
return result;
|
|
90
37
|
},
|
|
91
38
|
};
|
|
92
39
|
}
|
|
93
|
-
function round6(n) {
|
|
94
|
-
return Math.round(n * 1_000_000) / 1_000_000;
|
|
95
|
-
}
|
|
96
40
|
//# sourceMappingURL=session-cost.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cost.js","sourceRoot":"","sources":["../../src/tools/session-cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"session-cost.js","sourceRoot":"","sources":["../../src/tools/session-cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAyB/D,MAAM,UAAU,qBAAqB,CAAC,IAAqB;IACzD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC;IAC3D,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,0EAA0E;YAC1E,yEAAyE;YACzE,sBAAsB;QACxB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oFAAoF;iBACvF;aACF;YACD,QAAQ,EAAE,EAAE;YACZ,oBAAoB,EAAE,KAAK;SAC5B;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,GAAuB,CAAC;YACtC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;YAC3D,MAAM,IAAI,GAAwD,EAAE,CAAC;YACrE,IAAI,SAAS,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3C,wEAAwE;YACxE,wEAAwE;YACxE,oEAAoE;YACpE,0BAA0B;YAC1B,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBACzD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,+DAA+D,EAAE,CAAC;YAC9F,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,59 +1,39 @@
|
|
|
1
1
|
import { strict as assert } from 'node:assert';
|
|
2
2
|
import { describe, it } from 'node:test';
|
|
3
3
|
import { createSessionCostTool } from './session-cost.js';
|
|
4
|
-
const PRICING = {
|
|
5
|
-
'claude-sonnet-4-5': {
|
|
6
|
-
input: 3,
|
|
7
|
-
output: 15,
|
|
8
|
-
cacheRead: 0.3,
|
|
9
|
-
cacheWrite: 3.75,
|
|
10
|
-
reasoningMode: 'same_as_output',
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
function turn(overrides = {}) {
|
|
14
|
-
return {
|
|
15
|
-
v: 1,
|
|
16
|
-
source: 'claude-code',
|
|
17
|
-
sessionId: 's1',
|
|
18
|
-
messageId: 'm1',
|
|
19
|
-
turnIndex: 0,
|
|
20
|
-
ts: '2026-04-24T10:00:00.000Z',
|
|
21
|
-
model: 'claude-sonnet-4-5',
|
|
22
|
-
usage: {
|
|
23
|
-
input: 1000,
|
|
24
|
-
output: 500,
|
|
25
|
-
reasoning: 0,
|
|
26
|
-
cacheRead: 0,
|
|
27
|
-
cacheCreate5m: 0,
|
|
28
|
-
cacheCreate1h: 0,
|
|
29
|
-
},
|
|
30
|
-
toolCalls: [],
|
|
31
|
-
enrichment: {},
|
|
32
|
-
...overrides,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
4
|
describe('createSessionCostTool', () => {
|
|
36
|
-
it('returns
|
|
5
|
+
it('returns the SDK no-session shape with the MCP-specific note when no id is registered', async () => {
|
|
37
6
|
const tool = createSessionCostTool({
|
|
38
7
|
defaultSessionId: undefined,
|
|
39
|
-
|
|
40
|
-
|
|
8
|
+
sessionCost: async () => ({
|
|
9
|
+
sessionId: null,
|
|
10
|
+
totalUSD: 0,
|
|
11
|
+
totalTokens: 0,
|
|
12
|
+
turnCount: 0,
|
|
13
|
+
models: [],
|
|
14
|
+
note: 'no session id provided',
|
|
15
|
+
}),
|
|
41
16
|
});
|
|
42
17
|
const result = (await tool.handler({}));
|
|
43
18
|
assert.equal(result.sessionId, null);
|
|
44
19
|
assert.equal(result.totalUSD, 0);
|
|
45
20
|
assert.equal(result.turnCount, 0);
|
|
46
|
-
assert.match(result.note ?? '', /no session id/);
|
|
21
|
+
assert.match(result.note ?? '', /no session id provided and server was not registered/);
|
|
47
22
|
});
|
|
48
23
|
it('uses the override sessionId when provided', async () => {
|
|
49
24
|
let queriedFor;
|
|
50
25
|
const tool = createSessionCostTool({
|
|
51
26
|
defaultSessionId: 'default-id',
|
|
52
|
-
|
|
53
|
-
queriedFor =
|
|
54
|
-
return
|
|
27
|
+
sessionCost: async (opts) => {
|
|
28
|
+
queriedFor = opts.session;
|
|
29
|
+
return {
|
|
30
|
+
sessionId: opts.session ?? null,
|
|
31
|
+
totalUSD: 0,
|
|
32
|
+
totalTokens: 0,
|
|
33
|
+
turnCount: 1,
|
|
34
|
+
models: ['claude-sonnet-4-5'],
|
|
35
|
+
};
|
|
55
36
|
},
|
|
56
|
-
loadPricing: async () => PRICING,
|
|
57
37
|
});
|
|
58
38
|
await tool.handler({ sessionId: 'override-id' });
|
|
59
39
|
assert.equal(queriedFor, 'override-id');
|
|
@@ -62,61 +42,58 @@ describe('createSessionCostTool', () => {
|
|
|
62
42
|
let queriedFor;
|
|
63
43
|
const tool = createSessionCostTool({
|
|
64
44
|
defaultSessionId: 'baked-id',
|
|
65
|
-
|
|
66
|
-
queriedFor =
|
|
67
|
-
return
|
|
45
|
+
sessionCost: async (opts) => {
|
|
46
|
+
queriedFor = opts.session;
|
|
47
|
+
return {
|
|
48
|
+
sessionId: opts.session ?? null,
|
|
49
|
+
totalUSD: 0,
|
|
50
|
+
totalTokens: 0,
|
|
51
|
+
turnCount: 0,
|
|
52
|
+
models: [],
|
|
53
|
+
};
|
|
68
54
|
},
|
|
69
|
-
loadPricing: async () => PRICING,
|
|
70
55
|
});
|
|
71
56
|
await tool.handler({});
|
|
72
57
|
assert.equal(queriedFor, 'baked-id');
|
|
73
58
|
});
|
|
74
|
-
it('
|
|
75
|
-
const turns = [
|
|
76
|
-
turn({
|
|
77
|
-
usage: {
|
|
78
|
-
input: 1_000_000,
|
|
79
|
-
output: 0,
|
|
80
|
-
reasoning: 0,
|
|
81
|
-
cacheRead: 0,
|
|
82
|
-
cacheCreate5m: 0,
|
|
83
|
-
cacheCreate1h: 0,
|
|
84
|
-
},
|
|
85
|
-
}),
|
|
86
|
-
turn({
|
|
87
|
-
messageId: 'm2',
|
|
88
|
-
turnIndex: 1,
|
|
89
|
-
usage: {
|
|
90
|
-
input: 0,
|
|
91
|
-
output: 1_000_000,
|
|
92
|
-
reasoning: 0,
|
|
93
|
-
cacheRead: 0,
|
|
94
|
-
cacheCreate5m: 0,
|
|
95
|
-
cacheCreate1h: 0,
|
|
96
|
-
},
|
|
97
|
-
}),
|
|
98
|
-
];
|
|
59
|
+
it('returns the SDK result verbatim when a session id is present', async () => {
|
|
99
60
|
const tool = createSessionCostTool({
|
|
100
61
|
defaultSessionId: 's1',
|
|
101
|
-
|
|
102
|
-
|
|
62
|
+
sessionCost: async (opts) => ({
|
|
63
|
+
sessionId: opts.session ?? null,
|
|
64
|
+
totalUSD: 18,
|
|
65
|
+
totalTokens: 2_000_000,
|
|
66
|
+
turnCount: 2,
|
|
67
|
+
models: ['claude-sonnet-4-5'],
|
|
68
|
+
}),
|
|
103
69
|
});
|
|
104
70
|
const result = (await tool.handler({}));
|
|
71
|
+
assert.equal(result.sessionId, 's1');
|
|
105
72
|
assert.equal(result.turnCount, 2);
|
|
106
73
|
assert.equal(result.totalTokens, 2_000_000);
|
|
107
|
-
// 1M input @ $3/M + 1M output @ $15/M = $18.
|
|
108
74
|
assert.equal(result.totalUSD, 18);
|
|
109
75
|
assert.deepEqual(result.models, ['claude-sonnet-4-5']);
|
|
76
|
+
assert.equal(result.note, undefined);
|
|
110
77
|
});
|
|
111
|
-
it('
|
|
78
|
+
it('passes the host onLog through to the SDK so archive-fallback messages surface', async () => {
|
|
79
|
+
let captured;
|
|
112
80
|
const tool = createSessionCostTool({
|
|
113
81
|
defaultSessionId: 's1',
|
|
114
|
-
|
|
115
|
-
|
|
82
|
+
onLog: () => { },
|
|
83
|
+
sessionCost: async (opts) => {
|
|
84
|
+
captured = opts.onLog;
|
|
85
|
+
return {
|
|
86
|
+
sessionId: opts.session ?? null,
|
|
87
|
+
totalUSD: 0,
|
|
88
|
+
totalTokens: 0,
|
|
89
|
+
turnCount: 0,
|
|
90
|
+
models: [],
|
|
91
|
+
note: 'no turns recorded for this session yet',
|
|
92
|
+
};
|
|
93
|
+
},
|
|
116
94
|
});
|
|
117
|
-
|
|
118
|
-
assert.equal(
|
|
119
|
-
assert.match(result.note ?? '', /no turns recorded/);
|
|
95
|
+
await tool.handler({});
|
|
96
|
+
assert.equal(typeof captured, 'function');
|
|
120
97
|
});
|
|
121
98
|
it('declares its tool surface (name, description, schema)', () => {
|
|
122
99
|
const tool = createSessionCostTool({ defaultSessionId: undefined });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-cost.test.js","sourceRoot":"","sources":["../../src/tools/session-cost.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session-cost.test.js","sourceRoot":"","sources":["../../src/tools/session-cost.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayburn/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server exposing read-only relayburn ledger queries for in-session self-query",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,9 +19,10 @@
|
|
|
19
19
|
"node": ">=22"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@relayburn/reader": "1.
|
|
23
|
-
"@relayburn/
|
|
24
|
-
"@relayburn/
|
|
22
|
+
"@relayburn/reader": "1.10.0",
|
|
23
|
+
"@relayburn/sdk": "1.10.0",
|
|
24
|
+
"@relayburn/ledger": "1.10.0",
|
|
25
|
+
"@relayburn/analyze": "1.10.0"
|
|
25
26
|
},
|
|
26
27
|
"repository": {
|
|
27
28
|
"type": "git",
|