@@ -15,19 +15,27 @@ import type {ServerOptions} from '@modelcontextprotocol/sdk/server/index.js';
1515import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js' ;
1616import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js' ;
1717import type { ZodRawShape } from 'zod' ;
18+ import type { Telemetry } from './utils/telemetry.js' ;
1819
1920/**
2021 * Extended server options.
2122 */
22- export type B2CDxMcpServerOptions = ServerOptions ;
23+ export interface B2CDxMcpServerOptions extends ServerOptions {
24+ /**
25+ * Telemetry instance for tracking server and tool events.
26+ * If not provided, telemetry is disabled.
27+ */
28+ telemetry ?: Telemetry ;
29+ }
2330
2431/**
2532 * A server implementation that extends the base MCP server.
2633 *
27- *
2834 * @augments {McpServer }
2935 */
3036export class B2CDxMcpServer extends McpServer {
37+ private telemetry ?: Telemetry ;
38+
3139 /**
3240 * Creates a new B2CDxMcpServer instance
3341 *
@@ -36,15 +44,17 @@ export class B2CDxMcpServer extends McpServer {
3644 */
3745 public constructor ( serverInfo : Implementation , options ?: B2CDxMcpServerOptions ) {
3846 super ( serverInfo , options ) ;
47+ this . telemetry = options ?. telemetry ;
3948
4049 // Set up oninitialized handler
4150 this . server . oninitialized = ( ) : void => {
4251 const clientInfo = this . server . getClientVersion ( ) ;
4352 if ( clientInfo ) {
44- // TODO: Telemetry - Add client info attributes
45- // telemetry.addAttributes({ clientName: clientInfo.name, clientVersion: clientInfo.version });
53+ this . telemetry ?. addAttributes ( {
54+ clientName : clientInfo . name ,
55+ clientVersion : clientInfo . version ,
56+ } ) ;
4657 }
47- // TODO: Telemetry - Send SERVER_START_SUCCESS event
4858 } ;
4959 }
5060
@@ -68,13 +78,29 @@ export class B2CDxMcpServer extends McpServer {
6878 args : Record < string , unknown > ,
6979 _extra : RequestHandlerExtra < ServerRequest , ServerNotification > ,
7080 ) : Promise < CallToolResult > => {
71- // TODO: Telemetry - Track timing and send TOOL_CALLED event
72- // const startTime = Date.now();
73- const result = await handler ( args ) ;
74- // const runtimeMs = Date.now() - startTime;
75- // telemetry.sendEvent('TOOL_CALLED', { name, runtimeMs, isError: result.isError });
81+ const startTime = Date . now ( ) ;
82+ try {
83+ const result = await handler ( args ) ;
84+ const runTimeMs = Date . now ( ) - startTime ;
7685
77- return result ;
86+ this . telemetry ?. sendEvent ( 'TOOL_CALLED' , {
87+ toolName : name ,
88+ runTimeMs,
89+ isError : result . isError ?? false ,
90+ } ) ;
91+
92+ return result ;
93+ } catch ( error ) {
94+ const runTimeMs = Date . now ( ) - startTime ;
95+
96+ this . telemetry ?. sendEvent ( 'TOOL_CALLED' , {
97+ toolName : name ,
98+ runTimeMs,
99+ isError : true ,
100+ } ) ;
101+
102+ throw error ;
103+ }
78104 } ;
79105
80106 // Use the new registerTool API (tool() is deprecated)
@@ -85,10 +111,22 @@ export class B2CDxMcpServer extends McpServer {
85111 * Connect to a transport.
86112 */
87113 public override async connect ( transport : Transport ) : Promise < void > {
88- await super . connect ( transport ) ;
89- if ( ! this . isConnected ( ) ) {
90- // TODO: Telemetry - Send SERVER_START_ERROR event with "Server not connected"
114+ try {
115+ await super . connect ( transport ) ;
116+ if ( this . isConnected ( ) ) {
117+ this . telemetry ?. sendEvent ( 'SERVER_STATUS' , { status : 'started' } ) ;
118+ } else {
119+ this . telemetry ?. sendEvent ( 'SERVER_STATUS' , {
120+ status : 'error' ,
121+ errorMessage : 'Server not connected after connect() call' ,
122+ } ) ;
123+ }
124+ } catch ( error ) {
125+ this . telemetry ?. sendEvent ( 'SERVER_STATUS' , {
126+ status : 'error' ,
127+ errorMessage : error instanceof Error ? error . message : String ( error ) ,
128+ } ) ;
129+ throw error ;
91130 }
92- // TODO: Telemetry - wrap with try/catch to send SERVER_START_ERROR event with error details
93131 }
94132}
0 commit comments