proofscan 0.1.1 → 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 (71) hide show
  1. package/README.md +172 -24
  2. package/dist/cli.js +4 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive.d.ts +6 -0
  5. package/dist/commands/archive.d.ts.map +1 -0
  6. package/dist/commands/archive.js +245 -0
  7. package/dist/commands/archive.js.map +1 -0
  8. package/dist/commands/index.d.ts +2 -0
  9. package/dist/commands/index.d.ts.map +1 -1
  10. package/dist/commands/index.js +2 -0
  11. package/dist/commands/index.js.map +1 -1
  12. package/dist/commands/monitor.d.ts +1 -1
  13. package/dist/commands/monitor.d.ts.map +1 -1
  14. package/dist/commands/monitor.js +33 -21
  15. package/dist/commands/monitor.js.map +1 -1
  16. package/dist/commands/scan.d.ts.map +1 -1
  17. package/dist/commands/scan.js +4 -0
  18. package/dist/commands/scan.js.map +1 -1
  19. package/dist/commands/sessions.d.ts +6 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +203 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/db/connection.d.ts +28 -0
  24. package/dist/db/connection.d.ts.map +1 -0
  25. package/dist/db/connection.js +123 -0
  26. package/dist/db/connection.js.map +1 -0
  27. package/dist/db/events-store.d.ts +56 -0
  28. package/dist/db/events-store.d.ts.map +1 -0
  29. package/dist/db/events-store.js +269 -0
  30. package/dist/db/events-store.js.map +1 -0
  31. package/dist/db/index.d.ts +6 -0
  32. package/dist/db/index.d.ts.map +1 -0
  33. package/dist/db/index.js +6 -0
  34. package/dist/db/index.js.map +1 -0
  35. package/dist/db/proofs-store.d.ts +56 -0
  36. package/dist/db/proofs-store.d.ts.map +1 -0
  37. package/dist/db/proofs-store.js +116 -0
  38. package/dist/db/proofs-store.js.map +1 -0
  39. package/dist/db/schema.d.ts +8 -0
  40. package/dist/db/schema.d.ts.map +1 -0
  41. package/dist/db/schema.js +76 -0
  42. package/dist/db/schema.js.map +1 -0
  43. package/dist/db/types.d.ts +64 -0
  44. package/dist/db/types.d.ts.map +1 -0
  45. package/dist/db/types.js +5 -0
  46. package/dist/db/types.js.map +1 -0
  47. package/dist/index.d.ts +14 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +15 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/scanner/index.d.ts +3 -2
  52. package/dist/scanner/index.d.ts.map +1 -1
  53. package/dist/scanner/index.js +66 -51
  54. package/dist/scanner/index.js.map +1 -1
  55. package/dist/types/config.d.ts +7 -0
  56. package/dist/types/config.d.ts.map +1 -1
  57. package/dist/types/config.js +5 -0
  58. package/dist/types/config.js.map +1 -1
  59. package/dist/types/events.d.ts +1 -17
  60. package/dist/types/events.d.ts.map +1 -1
  61. package/dist/types/events.js +1 -0
  62. package/dist/types/events.js.map +1 -1
  63. package/package.json +3 -1
  64. package/dist/events/index.d.ts +0 -2
  65. package/dist/events/index.d.ts.map +0 -1
  66. package/dist/events/index.js +0 -2
  67. package/dist/events/index.js.map +0 -1
  68. package/dist/events/store.d.ts +0 -25
  69. package/dist/events/store.d.ts.map +0 -1
  70. package/dist/events/store.js +0 -91
  71. package/dist/events/store.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -2,10 +2,18 @@
2
2
  * proofscan - MCP Server scanner
3
3
  * Programmatic API exports
4
4
  */
5
- export * from './types/index.js';
6
- export * from './config/index.js';
7
- export * from './transports/index.js';
8
- export * from './events/index.js';
9
- export * from './scanner/index.js';
10
- export * from './utils/index.js';
5
+ export type { TransportType, StdioTransport, HttpTransport, SseTransport, Transport, ConnectorPlugins, Connector, RetentionConfig, Config, } from './types/config.js';
6
+ export { DEFAULT_CONFIG, DEFAULT_RETENTION } from './types/config.js';
7
+ export type { ExitReason, EventDirection, EventKind, Session, RpcCall, Event, Proof, SessionWithStats, PruneCandidate, ArchivePlan, } from './db/types.js';
8
+ export { ConfigManager, parseConfig, validateConfig } from './config/index.js';
9
+ export { parseMcpServers, readStdin } from './config/import.js';
10
+ export { StdioConnection } from './transports/stdio.js';
11
+ export type { JsonRpcRequest, JsonRpcResponse, JsonRpcNotification, JsonRpcMessage } from './transports/stdio.js';
12
+ export { EventsStore } from './db/events-store.js';
13
+ export { ProofsStore } from './db/proofs-store.js';
14
+ export { getEventsDb, getProofsDb, closeAllDbs, getDbSizes } from './db/connection.js';
15
+ export { Scanner } from './scanner/index.js';
16
+ export type { ScanResult, ScanOptions } from './scanner/index.js';
17
+ export { resolveConfigPath, getDefaultConfigDir, getDefaultConfigPath, getEventsDir } from './utils/config-path.js';
18
+ export { atomicWriteFile, readFileSafe, fileExists, appendLine, readLastLines } from './utils/fs.js';
11
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,MAAM,GACP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,KAAK,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGlH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -2,10 +2,19 @@
2
2
  * proofscan - MCP Server scanner
3
3
  * Programmatic API exports
4
4
  */
5
- export * from './types/index.js';
6
- export * from './config/index.js';
7
- export * from './transports/index.js';
8
- export * from './events/index.js';
9
- export * from './scanner/index.js';
10
- export * from './utils/index.js';
5
+ export { DEFAULT_CONFIG, DEFAULT_RETENTION } from './types/config.js';
6
+ // Config
7
+ export { ConfigManager, parseConfig, validateConfig } from './config/index.js';
8
+ export { parseMcpServers, readStdin } from './config/import.js';
9
+ // Transports
10
+ export { StdioConnection } from './transports/stdio.js';
11
+ // Database (Phase2)
12
+ export { EventsStore } from './db/events-store.js';
13
+ export { ProofsStore } from './db/proofs-store.js';
14
+ export { getEventsDb, getProofsDb, closeAllDbs, getDbSizes } from './db/connection.js';
15
+ // Scanner
16
+ export { Scanner } from './scanner/index.js';
17
+ // Utils
18
+ export { resolveConfigPath, getDefaultConfigDir, getDefaultConfigPath, getEventsDir } from './utils/config-path.js';
19
+ export { atomicWriteFile, readFileSafe, fileExists, appendLine, readLastLines } from './utils/fs.js';
11
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAgBtE,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEvF,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,QAAQ;AACR,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Scanner - orchestrates MCP server scanning
3
- * Connects, performs handshake, calls tools/list, logs events
3
+ * Connects, performs handshake, calls tools/list, logs events to SQLite
4
4
  */
5
5
  import type { Connector } from '../types/index.js';
6
6
  export interface ScanResult {
7
7
  success: boolean;
8
8
  connectorId: string;
9
+ sessionId: string;
9
10
  tools?: unknown[];
10
11
  error?: string;
11
12
  eventCount: number;
@@ -14,7 +15,7 @@ export interface ScanOptions {
14
15
  timeout?: number;
15
16
  }
16
17
  export declare class Scanner {
17
- private eventStore;
18
+ private eventsStore;
18
19
  private configDir;
19
20
  constructor(configDir: string);
20
21
  scan(connector: Connector, options?: ScanOptions): Promise<ScanResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAKvB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;CAyLjF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAKnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAKvB,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;CAiNjF"}
@@ -1,35 +1,45 @@
1
1
  /**
2
2
  * Scanner - orchestrates MCP server scanning
3
- * Connects, performs handshake, calls tools/list, logs events
3
+ * Connects, performs handshake, calls tools/list, logs events to SQLite
4
4
  */
5
5
  import { StdioConnection } from '../transports/stdio.js';
6
- import { EventStore } from '../events/store.js';
6
+ import { EventsStore } from '../db/events-store.js';
7
7
  export class Scanner {
8
- eventStore;
8
+ eventsStore;
9
9
  configDir;
10
10
  constructor(configDir) {
11
11
  this.configDir = configDir;
12
- this.eventStore = new EventStore(configDir);
12
+ this.eventsStore = new EventsStore(configDir);
13
13
  }
14
14
  async scan(connector, options = {}) {
15
15
  const timeout = (options.timeout || 30) * 1000;
16
16
  let eventCount = 0;
17
17
  if (connector.transport.type !== 'stdio') {
18
+ // Create a session even for unsupported transport to record the failure
19
+ const session = this.eventsStore.createSession(connector.id);
20
+ this.eventsStore.saveEvent(session.session_id, 'client_to_server', 'transport_event', {
21
+ rawJson: JSON.stringify({ type: 'error', message: `Unsupported transport type: ${connector.transport.type}` }),
22
+ });
23
+ this.eventsStore.endSession(session.session_id, 'error');
18
24
  return {
19
25
  success: false,
20
26
  connectorId: connector.id,
27
+ sessionId: session.session_id,
21
28
  error: `Unsupported transport type: ${connector.transport.type}`,
22
- eventCount: 0,
29
+ eventCount: 1,
23
30
  };
24
31
  }
25
32
  const transport = connector.transport;
26
33
  const connection = new StdioConnection(transport);
27
- // Track if we've received an initialize response
28
- let initializeResponse = null;
34
+ // Create new session
35
+ const session = this.eventsStore.createSession(connector.id);
36
+ const sessionId = session.session_id;
37
+ // Track RPC calls
38
+ const rpcIdMap = new Map(); // Maps JSON-RPC id to our rpc_id
29
39
  try {
30
40
  // Log connection attempt
31
- await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
32
- raw: JSON.stringify({
41
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
42
+ rawJson: JSON.stringify({
33
43
  type: 'connect_attempt',
34
44
  command: transport.command,
35
45
  args: transport.args,
@@ -37,13 +47,11 @@ export class Scanner {
37
47
  });
38
48
  eventCount++;
39
49
  // Set up message logging
40
- connection.on('message', async (msg, raw) => {
50
+ connection.on('message', (msg, raw) => {
41
51
  const isRequest = 'method' in msg && 'id' in msg && msg.id !== null;
42
52
  const isNotification = 'method' in msg && !('id' in msg);
43
53
  const isResponse = 'id' in msg && !('method' in msg);
44
- // Determine direction based on who sent it
45
- // Requests/responses from server come through stdout
46
- // We already emit our own requests when we send them
54
+ // Determine direction based on message type
47
55
  const direction = isResponse ? 'server_to_client' :
48
56
  (isRequest || isNotification) && !('id' in msg && 'result' in msg) ? 'client_to_server' : 'server_to_client';
49
57
  let kind;
@@ -55,55 +63,55 @@ export class Scanner {
55
63
  kind = 'response';
56
64
  else
57
65
  kind = 'transport_event';
58
- const eventOpts = {
59
- raw,
60
- };
61
- if ('method' in msg) {
62
- eventOpts.method = msg.method;
66
+ let rpcId;
67
+ // Handle RPC tracking
68
+ if (isRequest && 'id' in msg && msg.id !== null && 'method' in msg) {
69
+ // New request - create RPC call record
70
+ const rpcCall = this.eventsStore.saveRpcCall(sessionId, String(msg.id), msg.method);
71
+ rpcIdMap.set(msg.id, rpcCall.rpc_id);
72
+ rpcId = rpcCall.rpc_id;
63
73
  }
64
- if ('id' in msg && msg.id !== null) {
65
- eventOpts.rpc_id = msg.id;
66
- }
67
- if (isResponse) {
68
- const resp = msg;
69
- eventOpts.ok = !resp.error;
70
- if (resp.error) {
71
- eventOpts.error = {
72
- code: resp.error.code,
73
- message: resp.error.message,
74
- };
74
+ else if (isResponse && 'id' in msg && msg.id !== null) {
75
+ // Response - complete RPC call
76
+ rpcId = rpcIdMap.get(msg.id);
77
+ if (rpcId) {
78
+ const resp = msg;
79
+ this.eventsStore.completeRpcCall(sessionId, String(msg.id), !resp.error, resp.error?.code);
75
80
  }
76
81
  }
77
- await this.eventStore.createEvent(connector.id, direction, kind, eventOpts);
82
+ this.eventsStore.saveEvent(sessionId, direction, kind, {
83
+ rpcId: rpcId || (('id' in msg && msg.id !== null) ? String(msg.id) : undefined),
84
+ rawJson: raw,
85
+ });
78
86
  eventCount++;
79
87
  });
80
- connection.on('stderr', async (data) => {
81
- await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
82
- raw: JSON.stringify({ type: 'stderr', data: data.trim() }),
88
+ connection.on('stderr', (data) => {
89
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
90
+ rawJson: JSON.stringify({ type: 'stderr', data: data.trim() }),
83
91
  });
84
92
  eventCount++;
85
93
  });
86
- connection.on('error', async (error) => {
87
- await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
88
- error: { code: -32000, message: error.message },
89
- raw: JSON.stringify({ type: 'error', message: error.message }),
94
+ connection.on('error', (error) => {
95
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
96
+ rawJson: JSON.stringify({ type: 'error', message: error.message }),
90
97
  });
91
98
  eventCount++;
92
99
  });
93
100
  // Connect
94
101
  await connection.connect();
95
- await this.eventStore.createEvent(connector.id, 'server_to_client', 'transport_event', {
96
- raw: JSON.stringify({ type: 'connected' }),
102
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
103
+ rawJson: JSON.stringify({ type: 'connected' }),
97
104
  });
98
105
  eventCount++;
99
106
  // MCP handshake: initialize
107
+ let initializeResponse;
100
108
  try {
101
109
  initializeResponse = await connection.sendRequest('initialize', {
102
110
  protocolVersion: '2024-11-05',
103
111
  capabilities: {},
104
112
  clientInfo: {
105
113
  name: 'proofscan',
106
- version: '0.1.0',
114
+ version: '0.2.0',
107
115
  },
108
116
  }, timeout);
109
117
  // Send initialized notification
@@ -111,14 +119,16 @@ export class Scanner {
111
119
  }
112
120
  catch (error) {
113
121
  const errMsg = error instanceof Error ? error.message : String(error);
114
- await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
115
- error: { code: -32000, message: `Initialize failed: ${errMsg}` },
116
- raw: JSON.stringify({ type: 'initialize_failed', error: errMsg }),
122
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
123
+ rawJson: JSON.stringify({ type: 'initialize_failed', error: errMsg }),
117
124
  });
118
125
  eventCount++;
126
+ this.eventsStore.endSession(sessionId, 'error');
127
+ connection.close();
119
128
  return {
120
129
  success: false,
121
130
  connectorId: connector.id,
131
+ sessionId,
122
132
  error: `Initialize failed: ${errMsg}`,
123
133
  eventCount,
124
134
  };
@@ -130,14 +140,16 @@ export class Scanner {
130
140
  }
131
141
  catch (error) {
132
142
  const errMsg = error instanceof Error ? error.message : String(error);
133
- await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
134
- error: { code: -32000, message: `tools/list failed: ${errMsg}` },
135
- raw: JSON.stringify({ type: 'tools_list_failed', error: errMsg }),
143
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
144
+ rawJson: JSON.stringify({ type: 'tools_list_failed', error: errMsg }),
136
145
  });
137
146
  eventCount++;
147
+ this.eventsStore.endSession(sessionId, 'error');
148
+ connection.close();
138
149
  return {
139
150
  success: false,
140
151
  connectorId: connector.id,
152
+ sessionId,
141
153
  error: `tools/list failed: ${errMsg}`,
142
154
  eventCount,
143
155
  };
@@ -148,28 +160,31 @@ export class Scanner {
148
160
  : undefined;
149
161
  // Close connection gracefully
150
162
  connection.close();
151
- await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
152
- raw: JSON.stringify({ type: 'disconnected' }),
163
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
164
+ rawJson: JSON.stringify({ type: 'disconnected' }),
153
165
  });
154
166
  eventCount++;
167
+ this.eventsStore.endSession(sessionId, 'normal');
155
168
  return {
156
169
  success: true,
157
170
  connectorId: connector.id,
171
+ sessionId,
158
172
  tools: tools || [],
159
173
  eventCount,
160
174
  };
161
175
  }
162
176
  catch (error) {
163
177
  const errMsg = error instanceof Error ? error.message : String(error);
164
- await this.eventStore.createEvent(connector.id, 'client_to_server', 'transport_event', {
165
- error: { code: -32000, message: errMsg },
166
- raw: JSON.stringify({ type: 'scan_error', error: errMsg }),
178
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
179
+ rawJson: JSON.stringify({ type: 'scan_error', error: errMsg }),
167
180
  });
168
181
  eventCount++;
182
+ this.eventsStore.endSession(sessionId, 'error');
169
183
  connection.close();
170
184
  return {
171
185
  success: false,
172
186
  connectorId: connector.id,
187
+ sessionId,
173
188
  error: errMsg,
174
189
  eventCount,
175
190
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
@@ -30,9 +30,16 @@ export interface Connector {
30
30
  transport: Transport;
31
31
  plugins?: ConnectorPlugins;
32
32
  }
33
+ export interface RetentionConfig {
34
+ keep_last_sessions?: number;
35
+ raw_days?: number;
36
+ max_db_mb?: number;
37
+ }
33
38
  export interface Config {
34
39
  version: 1;
35
40
  connectors: Connector[];
41
+ retention?: RetentionConfig;
36
42
  }
37
43
  export declare const DEFAULT_CONFIG: Config;
44
+ export declare const DEFAULT_RETENTION: RetentionConfig;
38
45
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAI/B,CAAC"}
@@ -5,4 +5,9 @@ export const DEFAULT_CONFIG = {
5
5
  version: 1,
6
6
  connectors: [],
7
7
  };
8
+ export const DEFAULT_RETENTION = {
9
+ keep_last_sessions: 50,
10
+ raw_days: 7,
11
+ max_db_mb: 500,
12
+ };
8
13
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2CH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,EAAE;CACf,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,kBAAkB,EAAE,EAAE;IACtB,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,GAAG;CACf,CAAC"}
@@ -1,23 +1,7 @@
1
1
  /**
2
2
  * Event types for proofscan
3
+ * Legacy - Phase2 uses db/types.ts
3
4
  */
4
- export type EventDirection = 'client_to_server' | 'server_to_client';
5
- export type EventKind = 'request' | 'response' | 'notification' | 'transport_event';
6
- export interface ScanEvent {
7
- event_id: string;
8
- ts: string;
9
- connector_id: string;
10
- direction: EventDirection;
11
- kind: EventKind;
12
- method?: string;
13
- rpc_id?: string | number;
14
- ok?: boolean;
15
- error?: {
16
- code: number;
17
- message: string;
18
- };
19
- raw?: string;
20
- }
21
5
  export declare const MAX_RAW_SIZE = 10000;
22
6
  export declare function truncateRaw(raw: string): string;
23
7
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AACrE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAEpF,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Event types for proofscan
3
+ * Legacy - Phase2 uses db/types.ts
3
4
  */
4
5
  export const MAX_RAW_SIZE = 10000; // Truncate raw data if larger than 10KB
5
6
  export function truncateRaw(raw) {
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,wCAAwC;AAE3E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO,GAAG,CAAC;IAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,iBAAiB,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,wCAAwC;AAE3E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO,GAAG,CAAC;IAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,iBAAiB,CAAC;AACxD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "proofscan",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "MCP Server scanner - eliminate black boxes by capturing JSON-RPC from connection to tools/list",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,12 +46,14 @@
46
46
  },
47
47
  "homepage": "https://github.com/proofofprotocol/proofscan#readme",
48
48
  "devDependencies": {
49
+ "@types/better-sqlite3": "^7.6.8",
49
50
  "@types/node": "^20.10.0",
50
51
  "@types/uuid": "^9.0.7",
51
52
  "typescript": "^5.3.0",
52
53
  "vitest": "^1.0.0"
53
54
  },
54
55
  "dependencies": {
56
+ "better-sqlite3": "^11.0.0",
55
57
  "commander": "^12.0.0",
56
58
  "uuid": "^9.0.1"
57
59
  },
@@ -1,2 +0,0 @@
1
- export * from './store.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './store.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Event storage - JSONL file based
3
- * Stores scan events in events/<connector_id>/<YYYYMMDD>.jsonl
4
- */
5
- import type { ScanEvent, EventDirection, EventKind } from '../types/index.js';
6
- export declare class EventStore {
7
- private eventsDir;
8
- constructor(configDir?: string);
9
- private getDateString;
10
- private getEventFilePath;
11
- saveEvent(event: Omit<ScanEvent, 'event_id' | 'ts'>): Promise<ScanEvent>;
12
- createEvent(connectorId: string, direction: EventDirection, kind: EventKind, options?: {
13
- method?: string;
14
- rpc_id?: string | number;
15
- ok?: boolean;
16
- error?: {
17
- code: number;
18
- message: string;
19
- };
20
- raw?: string;
21
- }): Promise<ScanEvent>;
22
- getRecentEvents(connectorId: string, count?: number): Promise<ScanEvent[]>;
23
- listConnectorDates(connectorId: string): Promise<string[]>;
24
- }
25
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAK9E,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAKlB,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAcxE,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,SAAS,EACf,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;KACT,GACL,OAAO,CAAC,SAAS,CAAC;IASf,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmC9E,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAajE"}
@@ -1,91 +0,0 @@
1
- /**
2
- * Event storage - JSONL file based
3
- * Stores scan events in events/<connector_id>/<YYYYMMDD>.jsonl
4
- */
5
- import { join } from 'path';
6
- import { promises as fs } from 'fs';
7
- import { randomUUID } from 'crypto';
8
- import { truncateRaw } from '../types/events.js';
9
- import { appendLine, readLastLines } from '../utils/fs.js';
10
- import { getEventsDir } from '../utils/config-path.js';
11
- export class EventStore {
12
- eventsDir;
13
- constructor(configDir) {
14
- this.eventsDir = getEventsDir(configDir);
15
- }
16
- getDateString() {
17
- const now = new Date();
18
- const year = now.getFullYear();
19
- const month = String(now.getMonth() + 1).padStart(2, '0');
20
- const day = String(now.getDate()).padStart(2, '0');
21
- return `${year}${month}${day}`;
22
- }
23
- getEventFilePath(connectorId, date) {
24
- const dateStr = date || this.getDateString();
25
- return join(this.eventsDir, connectorId, `${dateStr}.jsonl`);
26
- }
27
- async saveEvent(event) {
28
- const fullEvent = {
29
- event_id: randomUUID(),
30
- ts: new Date().toISOString(),
31
- ...event,
32
- raw: event.raw ? truncateRaw(event.raw) : undefined,
33
- };
34
- const filePath = this.getEventFilePath(event.connector_id);
35
- await appendLine(filePath, JSON.stringify(fullEvent));
36
- return fullEvent;
37
- }
38
- async createEvent(connectorId, direction, kind, options = {}) {
39
- return this.saveEvent({
40
- connector_id: connectorId,
41
- direction,
42
- kind,
43
- ...options,
44
- });
45
- }
46
- async getRecentEvents(connectorId, count = 20) {
47
- // List all event files for this connector
48
- const connectorDir = join(this.eventsDir, connectorId);
49
- try {
50
- const files = await fs.readdir(connectorDir);
51
- const jsonlFiles = files.filter(f => f.endsWith('.jsonl')).sort().reverse();
52
- const events = [];
53
- for (const file of jsonlFiles) {
54
- if (events.length >= count)
55
- break;
56
- const filePath = join(connectorDir, file);
57
- const remaining = count - events.length;
58
- const lines = await readLastLines(filePath, remaining);
59
- for (const line of lines.reverse()) {
60
- try {
61
- events.unshift(JSON.parse(line));
62
- }
63
- catch {
64
- // Skip invalid lines
65
- }
66
- }
67
- }
68
- return events.slice(-count);
69
- }
70
- catch (error) {
71
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
72
- return [];
73
- }
74
- throw error;
75
- }
76
- }
77
- async listConnectorDates(connectorId) {
78
- const connectorDir = join(this.eventsDir, connectorId);
79
- try {
80
- const files = await fs.readdir(connectorDir);
81
- return files
82
- .filter(f => f.endsWith('.jsonl'))
83
- .map(f => f.replace('.jsonl', ''))
84
- .sort();
85
- }
86
- catch {
87
- return [];
88
- }
89
- }
90
- }
91
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"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"}