@kernel.chat/kbot-finance 0.2.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.
Files changed (100) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +188 -0
  3. package/RFC-content-addressed-mcp.md +240 -0
  4. package/dist/adapters/edgar/client.d.ts +11 -0
  5. package/dist/adapters/edgar/client.d.ts.map +1 -0
  6. package/dist/adapters/edgar/client.js +56 -0
  7. package/dist/adapters/edgar/client.js.map +1 -0
  8. package/dist/adapters/edgar/commands.d.ts +27 -0
  9. package/dist/adapters/edgar/commands.d.ts.map +1 -0
  10. package/dist/adapters/edgar/commands.js +56 -0
  11. package/dist/adapters/edgar/commands.js.map +1 -0
  12. package/dist/adapters/edgar/index.d.ts +4 -0
  13. package/dist/adapters/edgar/index.d.ts.map +1 -0
  14. package/dist/adapters/edgar/index.js +4 -0
  15. package/dist/adapters/edgar/index.js.map +1 -0
  16. package/dist/adapters/edgar/types.d.ts +70 -0
  17. package/dist/adapters/edgar/types.d.ts.map +1 -0
  18. package/dist/adapters/edgar/types.js +23 -0
  19. package/dist/adapters/edgar/types.js.map +1 -0
  20. package/dist/adapters/polymarket/client.d.ts +7 -0
  21. package/dist/adapters/polymarket/client.d.ts.map +1 -0
  22. package/dist/adapters/polymarket/client.js +58 -0
  23. package/dist/adapters/polymarket/client.js.map +1 -0
  24. package/dist/adapters/polymarket/commands.d.ts +30 -0
  25. package/dist/adapters/polymarket/commands.d.ts.map +1 -0
  26. package/dist/adapters/polymarket/commands.js +67 -0
  27. package/dist/adapters/polymarket/commands.js.map +1 -0
  28. package/dist/adapters/polymarket/index.d.ts +4 -0
  29. package/dist/adapters/polymarket/index.d.ts.map +1 -0
  30. package/dist/adapters/polymarket/index.js +4 -0
  31. package/dist/adapters/polymarket/index.js.map +1 -0
  32. package/dist/adapters/polymarket/types.d.ts +58 -0
  33. package/dist/adapters/polymarket/types.d.ts.map +1 -0
  34. package/dist/adapters/polymarket/types.js +12 -0
  35. package/dist/adapters/polymarket/types.js.map +1 -0
  36. package/dist/audit-log.d.ts +65 -0
  37. package/dist/audit-log.d.ts.map +1 -0
  38. package/dist/audit-log.js +96 -0
  39. package/dist/audit-log.js.map +1 -0
  40. package/dist/cli.d.ts +3 -0
  41. package/dist/cli.d.ts.map +1 -0
  42. package/dist/cli.js +44 -0
  43. package/dist/cli.js.map +1 -0
  44. package/dist/demo.d.ts +11 -0
  45. package/dist/demo.d.ts.map +1 -0
  46. package/dist/demo.js +133 -0
  47. package/dist/demo.js.map +1 -0
  48. package/dist/envelope.d.ts +71 -0
  49. package/dist/envelope.d.ts.map +1 -0
  50. package/dist/envelope.js +83 -0
  51. package/dist/envelope.js.map +1 -0
  52. package/dist/exporters/annex-iv.d.ts +40 -0
  53. package/dist/exporters/annex-iv.d.ts.map +1 -0
  54. package/dist/exporters/annex-iv.js +154 -0
  55. package/dist/exporters/annex-iv.js.map +1 -0
  56. package/dist/governance.d.ts +55 -0
  57. package/dist/governance.d.ts.map +1 -0
  58. package/dist/governance.js +73 -0
  59. package/dist/governance.js.map +1 -0
  60. package/dist/index.d.ts +32 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +32 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/kbot-tool.d.ts +31 -0
  65. package/dist/kbot-tool.d.ts.map +1 -0
  66. package/dist/kbot-tool.js +325 -0
  67. package/dist/kbot-tool.js.map +1 -0
  68. package/dist/mcp-server.d.ts +25 -0
  69. package/dist/mcp-server.d.ts.map +1 -0
  70. package/dist/mcp-server.js +80 -0
  71. package/dist/mcp-server.js.map +1 -0
  72. package/dist/tools/edgar-query.d.ts +36 -0
  73. package/dist/tools/edgar-query.d.ts.map +1 -0
  74. package/dist/tools/edgar-query.js +108 -0
  75. package/dist/tools/edgar-query.js.map +1 -0
  76. package/dist/tools/polymarket-query.d.ts +55 -0
  77. package/dist/tools/polymarket-query.d.ts.map +1 -0
  78. package/dist/tools/polymarket-query.js +128 -0
  79. package/dist/tools/polymarket-query.js.map +1 -0
  80. package/dist/verifier/eu-rts6.d.ts +3 -0
  81. package/dist/verifier/eu-rts6.d.ts.map +1 -0
  82. package/dist/verifier/eu-rts6.js +45 -0
  83. package/dist/verifier/eu-rts6.js.map +1 -0
  84. package/dist/verifier/index.d.ts +67 -0
  85. package/dist/verifier/index.d.ts.map +1 -0
  86. package/dist/verifier/index.js +22 -0
  87. package/dist/verifier/index.js.map +1 -0
  88. package/dist/verifier/kelly-cap.d.ts +19 -0
  89. package/dist/verifier/kelly-cap.d.ts.map +1 -0
  90. package/dist/verifier/kelly-cap.js +64 -0
  91. package/dist/verifier/kelly-cap.js.map +1 -0
  92. package/dist/verifier/model-version.d.ts +3 -0
  93. package/dist/verifier/model-version.d.ts.map +1 -0
  94. package/dist/verifier/model-version.js +28 -0
  95. package/dist/verifier/model-version.js.map +1 -0
  96. package/dist/verifier/position-limit.d.ts +21 -0
  97. package/dist/verifier/position-limit.d.ts.map +1 -0
  98. package/dist/verifier/position-limit.js +42 -0
  99. package/dist/verifier/position-limit.js.map +1 -0
  100. package/package.json +101 -0
@@ -0,0 +1,73 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ import { canonicalize } from "./envelope.js";
3
+ /** Compute the canonical signing input for an approval. */
4
+ function signingInput(req, approver_id, approved_at) {
5
+ const payload = {
6
+ approved_at,
7
+ approver_id,
8
+ materiality: req.materiality,
9
+ request_hash: req.request_hash,
10
+ session_id: req.session_id,
11
+ summary: req.summary,
12
+ };
13
+ return canonicalize(payload);
14
+ }
15
+ /**
16
+ * Approver — issues signed approval tokens. In production this is a separate
17
+ * service held by compliance; for v0.1 it's an in-process module.
18
+ */
19
+ export class Approver {
20
+ approver_id;
21
+ secret;
22
+ constructor(approver_id, secret) {
23
+ this.approver_id = approver_id;
24
+ this.secret = secret;
25
+ }
26
+ approve(request) {
27
+ const approved_at = new Date().toISOString();
28
+ const sig = createHmac("sha256", this.secret)
29
+ .update(signingInput(request, this.approver_id, approved_at), "utf8")
30
+ .digest("hex");
31
+ return {
32
+ ...request,
33
+ approver_id: this.approver_id,
34
+ approved_at,
35
+ signature: sig,
36
+ };
37
+ }
38
+ }
39
+ /**
40
+ * Verify an approval token. Returns true iff the signature matches and the
41
+ * approver is in the provided trust set.
42
+ */
43
+ export function verifyApproval(token, trusted, request) {
44
+ // Bind every field to the request being signed off. A token cannot be
45
+ // replayed against a different request.
46
+ if (token.request_hash !== request.request_hash) {
47
+ return { ok: false, reason: "request_hash_mismatch" };
48
+ }
49
+ if (token.session_id !== request.session_id) {
50
+ return { ok: false, reason: "session_id_mismatch" };
51
+ }
52
+ if (token.materiality !== request.materiality) {
53
+ return { ok: false, reason: "materiality_mismatch" };
54
+ }
55
+ if (token.summary !== request.summary) {
56
+ return { ok: false, reason: "summary_mismatch" };
57
+ }
58
+ const secret = trusted.get(token.approver_id);
59
+ if (secret === undefined) {
60
+ return { ok: false, reason: "unknown_approver" };
61
+ }
62
+ const expected = createHmac("sha256", secret)
63
+ .update(signingInput(request, token.approver_id, token.approved_at), "utf8")
64
+ .digest("hex");
65
+ const a = Buffer.from(token.signature, "hex");
66
+ const b = Buffer.from(expected, "hex");
67
+ if (a.length !== b.length)
68
+ return { ok: false, reason: "bad_signature" };
69
+ if (!timingSafeEqual(a, b))
70
+ return { ok: false, reason: "bad_signature" };
71
+ return { ok: true };
72
+ }
73
+ //# sourceMappingURL=governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../src/governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @kernel.chat/kbot-finance — Audit-grade AI infrastructure for capital markets.
3
+ *
4
+ * Three layers, one architecture:
5
+ *
6
+ * 1. Deterministic engine adapters — call known-good engines, never compute
7
+ * the number in the AI layer. Content-addressed request envelopes guarantee
8
+ * replay semantics.
9
+ *
10
+ * 2. Regulatory verifier — Norm-AI-pattern rules-as-code. Every action passes
11
+ * through before the engine call. Failures emit adverse-action reason codes.
12
+ *
13
+ * 3. Hash-chained audit log — append-only, WORM-compatible, legally defensible.
14
+ * Every request, verifier check, engine response, approval, and incident is
15
+ * recorded with a hash linking it to the previous entry.
16
+ *
17
+ * The AI Intelligence Layer (kbot) calls into this package. The engines (Polymarket
18
+ * Gamma in v0.1; QuantLib, NautilusTrader, Aeron, alts-NAV in later versions) sit
19
+ * underneath. Regulators read the audit log.
20
+ *
21
+ * Apache 2.0. Reference implementation; not yet certified for production trading.
22
+ */
23
+ export * from "./envelope.js";
24
+ export * from "./audit-log.js";
25
+ export * from "./governance.js";
26
+ export * from "./verifier/index.js";
27
+ export * as polymarket from "./adapters/polymarket/index.js";
28
+ export * as edgar from "./adapters/edgar/index.js";
29
+ export * from "./tools/polymarket-query.js";
30
+ export * from "./tools/edgar-query.js";
31
+ export * from "./exporters/annex-iv.js";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,2BAA2B,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @kernel.chat/kbot-finance — Audit-grade AI infrastructure for capital markets.
3
+ *
4
+ * Three layers, one architecture:
5
+ *
6
+ * 1. Deterministic engine adapters — call known-good engines, never compute
7
+ * the number in the AI layer. Content-addressed request envelopes guarantee
8
+ * replay semantics.
9
+ *
10
+ * 2. Regulatory verifier — Norm-AI-pattern rules-as-code. Every action passes
11
+ * through before the engine call. Failures emit adverse-action reason codes.
12
+ *
13
+ * 3. Hash-chained audit log — append-only, WORM-compatible, legally defensible.
14
+ * Every request, verifier check, engine response, approval, and incident is
15
+ * recorded with a hash linking it to the previous entry.
16
+ *
17
+ * The AI Intelligence Layer (kbot) calls into this package. The engines (Polymarket
18
+ * Gamma in v0.1; QuantLib, NautilusTrader, Aeron, alts-NAV in later versions) sit
19
+ * underneath. Regulators read the audit log.
20
+ *
21
+ * Apache 2.0. Reference implementation; not yet certified for production trading.
22
+ */
23
+ export * from "./envelope.js";
24
+ export * from "./audit-log.js";
25
+ export * from "./governance.js";
26
+ export * from "./verifier/index.js";
27
+ export * as polymarket from "./adapters/polymarket/index.js";
28
+ export * as edgar from "./adapters/edgar/index.js";
29
+ export * from "./tools/polymarket-query.js";
30
+ export * from "./tools/edgar-query.js";
31
+ export * from "./exporters/annex-iv.js";
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,2BAA2B,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * kbot tool registry surface for kbot-finance.
3
+ *
4
+ * Exports kbot-shaped `ToolDefinition`s so kbot can register them alongside
5
+ * its existing 100+ skills. Mirrors the shape kbot's own tools use
6
+ * (peekaboo.ts, ableton.ts, etc.): name, description, typed parameters,
7
+ * tier, and an async `execute()` that returns a string and never throws.
8
+ *
9
+ * To wire into kbot:
10
+ *
11
+ * import { kbotFinanceTools } from '@kernel.chat/kbot-finance/kbot-tool'
12
+ * for (const t of kbotFinanceTools) registerTool(t)
13
+ *
14
+ * Or copy this file into kbot/src/tools/polymarket.ts directly if you
15
+ * prefer not to add a workspace dependency for v0.1.
16
+ */
17
+ export interface KbotToolDefinition {
18
+ name: string;
19
+ description: string;
20
+ parameters: Record<string, {
21
+ type: string;
22
+ description: string;
23
+ required?: boolean;
24
+ default?: unknown;
25
+ }>;
26
+ tier: "free" | "pro" | "growth" | "enterprise";
27
+ execute: (args: Record<string, unknown>) => Promise<string>;
28
+ }
29
+ export declare const kbotFinanceTools: readonly KbotToolDefinition[];
30
+ export declare function registerKbotFinanceTools(register: (t: KbotToolDefinition) => void): void;
31
+ //# sourceMappingURL=kbot-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbot-tool.d.ts","sourceRoot":"","sources":["../src/kbot-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAChB,MAAM,EACN;QACE,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CACF,CAAC;IACF,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7D;AAkUD,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EAKzD,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,GACxC,IAAI,CAEN"}
@@ -0,0 +1,325 @@
1
+ /**
2
+ * kbot tool registry surface for kbot-finance.
3
+ *
4
+ * Exports kbot-shaped `ToolDefinition`s so kbot can register them alongside
5
+ * its existing 100+ skills. Mirrors the shape kbot's own tools use
6
+ * (peekaboo.ts, ableton.ts, etc.): name, description, typed parameters,
7
+ * tier, and an async `execute()` that returns a string and never throws.
8
+ *
9
+ * To wire into kbot:
10
+ *
11
+ * import { kbotFinanceTools } from '@kernel.chat/kbot-finance/kbot-tool'
12
+ * for (const t of kbotFinanceTools) registerTool(t)
13
+ *
14
+ * Or copy this file into kbot/src/tools/polymarket.ts directly if you
15
+ * prefer not to add a workspace dependency for v0.1.
16
+ */
17
+ import { homedir } from "node:os";
18
+ import { join } from "node:path";
19
+ import { mkdir } from "node:fs/promises";
20
+ import { AppendOnlyAuditLog } from "./audit-log.js";
21
+ import { makePositionLimitRule, makeKellyCapRule, makeRts6AlgorithmDeclaredRule, makeModelVersionPinnedRule, } from "./verifier/index.js";
22
+ import { polymarketQuery } from "./tools/polymarket-query.js";
23
+ import { edgarQuery } from "./tools/edgar-query.js";
24
+ import { exportAnnexIv } from "./exporters/annex-iv.js";
25
+ import { writeFile } from "node:fs/promises";
26
+ // Default audit log location — one file per kbot install. Production
27
+ // deployments override via env: KBOT_FINANCE_AUDIT_LOG=<path>.
28
+ const DEFAULT_AUDIT_DIR = join(homedir(), ".kbot", "audit");
29
+ const DEFAULT_AUDIT_PATH = process.env["KBOT_FINANCE_AUDIT_LOG"] ?? join(DEFAULT_AUDIT_DIR, "polymarket.jsonl");
30
+ // Lazy audit-log singleton. The kbot CLI invokes tools as one-shot calls,
31
+ // so we cache the open log to keep the hash chain coherent across calls
32
+ // in the same process.
33
+ let auditLogPromise = null;
34
+ function getAuditLog() {
35
+ if (auditLogPromise === null) {
36
+ auditLogPromise = (async () => {
37
+ await mkdir(DEFAULT_AUDIT_DIR, { recursive: true });
38
+ return AppendOnlyAuditLog.open(DEFAULT_AUDIT_PATH);
39
+ })();
40
+ }
41
+ return auditLogPromise;
42
+ }
43
+ // Default rules. Operators can override at deploy time via env knobs.
44
+ const POSITION_MAX_SIZE = Number(process.env["KBOT_FINANCE_MAX_SIZE"] ?? 10_000);
45
+ const POSITION_MAX_NOTIONAL = Number(process.env["KBOT_FINANCE_MAX_NOTIONAL"] ?? 50_000);
46
+ const KELLY_FRACTION = Number(process.env["KBOT_FINANCE_KELLY_FRACTION"] ?? 0.5);
47
+ const KELLY_BANKROLL = Number(process.env["KBOT_FINANCE_BANKROLL"] ?? 100_000);
48
+ function defaultRules() {
49
+ return [
50
+ makePositionLimitRule({
51
+ default_max_size: POSITION_MAX_SIZE,
52
+ default_max_notional: POSITION_MAX_NOTIONAL,
53
+ }),
54
+ makeKellyCapRule({ kelly_fraction: KELLY_FRACTION, bankroll: KELLY_BANKROLL }),
55
+ makeRts6AlgorithmDeclaredRule(),
56
+ makeModelVersionPinnedRule(),
57
+ ];
58
+ }
59
+ function nowISO() {
60
+ return new Date().toISOString();
61
+ }
62
+ function sessionId() {
63
+ // kbot doesn't expose a session id at tool-call time; derive a stable
64
+ // one from process pid + start time so all calls within one kbot run
65
+ // share a hash-chain root in the audit log.
66
+ return `kbot-${process.pid}-${Math.floor((process.uptime ?? (() => 0))())}`;
67
+ }
68
+ /**
69
+ * polymarket_query — read-only access to Polymarket markets via Gamma API,
70
+ * wrapped in the kbot-finance audit substrate.
71
+ *
72
+ * Every call:
73
+ * 1. Builds a content-addressed envelope (replay key = request_hash).
74
+ * 2. Runs the regulatory verifier (Kelly + position-limit rules).
75
+ * 3. Logs verifier check + engine request + engine response in the
76
+ * hash-chained audit log at ~/.kbot/audit/polymarket.jsonl.
77
+ * 4. Returns normalized market data — NOT a price the AI itself computed.
78
+ *
79
+ * The AI never produces a market price. Gamma does. Replay against an
80
+ * indexer pinned to a block height is the v0.2 feature.
81
+ */
82
+ const polymarketQueryTool = {
83
+ name: "polymarket_query",
84
+ description: "Query Polymarket prediction-market data via Gamma API, with content-addressed envelopes and a hash-chained audit log. mode=list_active for top-volume markets, mode=by_id for a specific market. AI never produces the price — Gamma does. Audit log at ~/.kbot/audit/polymarket.jsonl.",
85
+ parameters: {
86
+ mode: {
87
+ type: "string",
88
+ description: "'list_active' for top markets by 24h volume, 'by_id' for a specific market.",
89
+ required: true,
90
+ },
91
+ market_id: {
92
+ type: "string",
93
+ description: "Market id (required when mode='by_id').",
94
+ },
95
+ limit: {
96
+ type: "number",
97
+ description: "Max markets to return when mode='list_active'. Default 5.",
98
+ default: 5,
99
+ },
100
+ jurisdiction: {
101
+ type: "string",
102
+ description: "Verifier jurisdiction tag (US/EU/UK/SG/HK/UAE/GLOBAL). Default US.",
103
+ default: "US",
104
+ },
105
+ },
106
+ tier: "free",
107
+ async execute(args) {
108
+ try {
109
+ const mode = args["mode"];
110
+ if (mode !== "list_active" && mode !== "by_id") {
111
+ return `Error: mode must be 'list_active' or 'by_id' (got: ${String(mode)})`;
112
+ }
113
+ const market_id = typeof args["market_id"] === "string" ? args["market_id"] : undefined;
114
+ if (mode === "by_id" && !market_id) {
115
+ return "Error: market_id is required when mode='by_id'";
116
+ }
117
+ const limit = typeof args["limit"] === "number" ? args["limit"] : 5;
118
+ const jurisdiction = typeof args["jurisdiction"] === "string"
119
+ ? args["jurisdiction"]
120
+ : "US";
121
+ const auditLog = await getAuditLog();
122
+ const result = await polymarketQuery({
123
+ mode,
124
+ ...(market_id ? { market_id } : {}),
125
+ limit,
126
+ data_as_of: nowISO(),
127
+ }, {
128
+ auditLog,
129
+ rules: defaultRules(),
130
+ verifierContext: { session_id: sessionId(), state: {}, jurisdiction },
131
+ });
132
+ if (!result.ok) {
133
+ return `Error (${result.stage}): ${JSON.stringify(result.detail, null, 2)}`;
134
+ }
135
+ // Return a compact summary plus the request_hash so the caller can
136
+ // request a replay later. Full markets are nested under `value`.
137
+ const summary = {
138
+ request_hash: result.response.request_hash,
139
+ engine_version: result.response.engine_version,
140
+ produced_at: result.response.produced_at,
141
+ byte_identical_replayable: result.response.byte_identical_replayable,
142
+ market_count: result.response.value.markets.length,
143
+ markets: result.response.value.markets,
144
+ };
145
+ return JSON.stringify(summary, null, 2);
146
+ }
147
+ catch (e) {
148
+ return `Error: ${e.message}`;
149
+ }
150
+ },
151
+ };
152
+ /**
153
+ * audit_log_verify — verify the integrity of the kbot-finance audit log
154
+ * on disk. Returns "ok" or "broken at seq=N". Useful before exporting
155
+ * the log as regulator evidence.
156
+ */
157
+ const auditLogVerifyTool = {
158
+ name: "audit_log_verify",
159
+ description: "Verify the hash-chain integrity of the kbot-finance audit log at ~/.kbot/audit/polymarket.jsonl. Returns ok or the broken sequence number.",
160
+ parameters: {
161
+ path: {
162
+ type: "string",
163
+ description: `Audit log path. Defaults to ${DEFAULT_AUDIT_PATH}.`,
164
+ },
165
+ },
166
+ tier: "free",
167
+ async execute(args) {
168
+ try {
169
+ const path = typeof args["path"] === "string" ? args["path"] : DEFAULT_AUDIT_PATH;
170
+ const result = await AppendOnlyAuditLog.verify(path);
171
+ if (result.ok) {
172
+ return JSON.stringify({ ok: true, path }, null, 2);
173
+ }
174
+ return JSON.stringify({ ok: false, path, broken_at_seq: result.broken_at_seq }, null, 2);
175
+ }
176
+ catch (e) {
177
+ return `Error: ${e.message}`;
178
+ }
179
+ },
180
+ };
181
+ /**
182
+ * edgar_query — read US SEC EDGAR filings/facts with audit-grade lineage.
183
+ * Filings are immutable by accession number; this is the cleanest
184
+ * content-addressing story available for US public-company data.
185
+ */
186
+ const edgarQueryTool = {
187
+ name: "edgar_query",
188
+ description: "Query SEC EDGAR public-company filings or XBRL company facts. mode=submissions returns recent filings (with accession numbers and direct archive URLs); mode=company_facts returns the keys of XBRL facts available for the company. AI never produces the data — SEC does. Audit log at ~/.kbot/audit/polymarket.jsonl.",
189
+ parameters: {
190
+ mode: {
191
+ type: "string",
192
+ description: "'submissions' for recent filings list, 'company_facts' for XBRL fact keys.",
193
+ required: true,
194
+ },
195
+ cik: {
196
+ type: "string",
197
+ description: "Central Index Key — numeric, with or without leading zeros (e.g. '320193' for Apple).",
198
+ required: true,
199
+ },
200
+ limit: {
201
+ type: "number",
202
+ description: "Max items to return. Default 25 for filings, 50 for facts.",
203
+ },
204
+ jurisdiction: {
205
+ type: "string",
206
+ description: "Verifier jurisdiction tag. Default US.",
207
+ default: "US",
208
+ },
209
+ },
210
+ tier: "free",
211
+ async execute(args) {
212
+ try {
213
+ const mode = args["mode"];
214
+ if (mode !== "submissions" && mode !== "company_facts") {
215
+ return `Error: mode must be 'submissions' or 'company_facts' (got: ${String(mode)})`;
216
+ }
217
+ const cik = typeof args["cik"] === "string" ? args["cik"] : undefined;
218
+ if (!cik)
219
+ return "Error: cik is required";
220
+ const limit = typeof args["limit"] === "number" ? args["limit"] : undefined;
221
+ const jurisdiction = typeof args["jurisdiction"] === "string"
222
+ ? args["jurisdiction"]
223
+ : "US";
224
+ const auditLog = await getAuditLog();
225
+ const result = await edgarQuery({
226
+ mode,
227
+ cik,
228
+ ...(limit !== undefined ? { limit } : {}),
229
+ data_as_of: nowISO(),
230
+ }, {
231
+ auditLog,
232
+ rules: defaultRules(),
233
+ verifierContext: { session_id: sessionId(), state: {}, jurisdiction },
234
+ });
235
+ if (!result.ok) {
236
+ return `Error (${result.stage}): ${JSON.stringify(result.detail, null, 2)}`;
237
+ }
238
+ const summary = {
239
+ request_hash: result.response.request_hash,
240
+ engine_version: result.response.engine_version,
241
+ produced_at: result.response.produced_at,
242
+ byte_identical_replayable: result.response.byte_identical_replayable,
243
+ entity_name: result.response.value.entity_name,
244
+ result_count: result.response.value.filings?.length ??
245
+ result.response.value.facts_keys?.length ??
246
+ 0,
247
+ ...(result.response.value.filings
248
+ ? { filings: result.response.value.filings }
249
+ : { facts_keys: result.response.value.facts_keys }),
250
+ };
251
+ return JSON.stringify(summary, null, 2);
252
+ }
253
+ catch (e) {
254
+ return `Error: ${e.message}`;
255
+ }
256
+ },
257
+ };
258
+ /**
259
+ * annex_iv_export — emit an EU AI Act Annex IV technical-documentation
260
+ * bundle from the audit log. Same artifact satisfies Fed SR 26-02
261
+ * technical documentation. Writes the rendered markdown to disk.
262
+ */
263
+ const annexIvExportTool = {
264
+ name: "annex_iv_export",
265
+ description: "Generate an EU AI Act Annex IV technical-documentation markdown bundle from the kbot-finance audit log. Same artifact satisfies Fed SR 26-02. Pass output_path to write to disk; otherwise the rendered content is returned inline.",
266
+ parameters: {
267
+ audit_log_path: {
268
+ type: "string",
269
+ description: `Audit log path. Defaults to ${DEFAULT_AUDIT_PATH}.`,
270
+ },
271
+ output_path: {
272
+ type: "string",
273
+ description: "If set, write the bundle to this path and return only the metadata.",
274
+ },
275
+ system_name: {
276
+ type: "string",
277
+ description: "System name to record in the Annex IV header.",
278
+ },
279
+ deployer: {
280
+ type: "string",
281
+ description: "Deployer / regulated entity name to record in the Annex IV header.",
282
+ },
283
+ jurisdiction: {
284
+ type: "string",
285
+ description: "Jurisdiction filed under (EU/US/UK/SG/HK/UAE/GLOBAL). Default EU.",
286
+ default: "EU",
287
+ },
288
+ },
289
+ tier: "free",
290
+ async execute(args) {
291
+ try {
292
+ const audit_log_path = typeof args["audit_log_path"] === "string" ? args["audit_log_path"] : DEFAULT_AUDIT_PATH;
293
+ const output_path = typeof args["output_path"] === "string" ? args["output_path"] : undefined;
294
+ const system_name = typeof args["system_name"] === "string" ? args["system_name"] : undefined;
295
+ const deployer = typeof args["deployer"] === "string" ? args["deployer"] : undefined;
296
+ const jurisdiction = typeof args["jurisdiction"] === "string"
297
+ ? args["jurisdiction"]
298
+ : "EU";
299
+ const bundle = await exportAnnexIv(audit_log_path, {
300
+ ...(system_name ? { system_name } : {}),
301
+ ...(deployer ? { deployer } : {}),
302
+ jurisdiction,
303
+ });
304
+ if (output_path) {
305
+ await writeFile(output_path, bundle.content, "utf8");
306
+ return JSON.stringify({ ok: true, output_path, meta: bundle.meta }, null, 2);
307
+ }
308
+ return bundle.content;
309
+ }
310
+ catch (e) {
311
+ return `Error: ${e.message}`;
312
+ }
313
+ },
314
+ };
315
+ export const kbotFinanceTools = [
316
+ polymarketQueryTool,
317
+ edgarQueryTool,
318
+ annexIvExportTool,
319
+ auditLogVerifyTool,
320
+ ];
321
+ export function registerKbotFinanceTools(register) {
322
+ for (const t of kbotFinanceTools)
323
+ register(t);
324
+ }
325
+ //# sourceMappingURL=kbot-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbot-tool.js","sourceRoot":"","sources":["../src/kbot-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * kbot-finance MCP server.
4
+ *
5
+ * Exposes the kbot-finance tools to any MCP client — Claude Code, Cursor,
6
+ * Claude.ai connectors, Replit Agent, kbot core, or anything else that
7
+ * speaks the protocol. The same content-addressed envelope + verifier +
8
+ * hash-chained audit log substrate that powers kbot's native tools is
9
+ * now available over stdio MCP.
10
+ *
11
+ * Usage:
12
+ * npx @kernel.chat/kbot-finance mcp
13
+ *
14
+ * Or in an MCP client config:
15
+ * {
16
+ * "mcpServers": {
17
+ * "kbot-finance": {
18
+ * "command": "npx",
19
+ * "args": ["-y", "@kernel.chat/kbot-finance", "mcp"]
20
+ * }
21
+ * }
22
+ * }
23
+ */
24
+ export declare function startMcpServer(): Promise<void>;
25
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA+BH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCpD"}
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * kbot-finance MCP server.
4
+ *
5
+ * Exposes the kbot-finance tools to any MCP client — Claude Code, Cursor,
6
+ * Claude.ai connectors, Replit Agent, kbot core, or anything else that
7
+ * speaks the protocol. The same content-addressed envelope + verifier +
8
+ * hash-chained audit log substrate that powers kbot's native tools is
9
+ * now available over stdio MCP.
10
+ *
11
+ * Usage:
12
+ * npx @kernel.chat/kbot-finance mcp
13
+ *
14
+ * Or in an MCP client config:
15
+ * {
16
+ * "mcpServers": {
17
+ * "kbot-finance": {
18
+ * "command": "npx",
19
+ * "args": ["-y", "@kernel.chat/kbot-finance", "mcp"]
20
+ * }
21
+ * }
22
+ * }
23
+ */
24
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
25
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
26
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
27
+ import { kbotFinanceTools } from "./kbot-tool.js";
28
+ const SERVER_NAME = "kbot-finance";
29
+ const SERVER_VERSION = "0.2.0";
30
+ function paramsToJsonSchema(tool) {
31
+ const properties = {};
32
+ const required = [];
33
+ for (const [name, spec] of Object.entries(tool.parameters)) {
34
+ properties[name] = {
35
+ type: spec.type,
36
+ description: spec.description,
37
+ };
38
+ if (spec.required)
39
+ required.push(name);
40
+ }
41
+ return { type: "object", properties, required };
42
+ }
43
+ export async function startMcpServer() {
44
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
45
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
46
+ tools: kbotFinanceTools.map((t) => ({
47
+ name: t.name,
48
+ description: t.description,
49
+ inputSchema: paramsToJsonSchema(t),
50
+ })),
51
+ }));
52
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
53
+ const { name, arguments: args } = request.params;
54
+ const tool = kbotFinanceTools.find((t) => t.name === name);
55
+ if (!tool) {
56
+ return {
57
+ content: [{ type: "text", text: `Error: unknown tool ${name}` }],
58
+ isError: true,
59
+ };
60
+ }
61
+ const result = await tool.execute((args ?? {}));
62
+ const isError = result.startsWith("Error");
63
+ return {
64
+ content: [{ type: "text", text: result }],
65
+ ...(isError ? { isError: true } : {}),
66
+ };
67
+ });
68
+ const transport = new StdioServerTransport();
69
+ await server.connect(transport);
70
+ // The transport keeps the process alive on stdin/stdout.
71
+ process.stderr.write(`${SERVER_NAME} v${SERVER_VERSION} MCP server ready on stdio — ${kbotFinanceTools.length} tools registered.\n`);
72
+ }
73
+ // Run when invoked as a script via `npx @kernel.chat/kbot-finance mcp`
74
+ if (import.meta.url === `file://${process.argv[1]}`) {
75
+ startMcpServer().catch((e) => {
76
+ process.stderr.write(`mcp server fatal: ${e.message}\n`);
77
+ process.exit(1);
78
+ });
79
+ }
80
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}