@@ -11,6 +11,8 @@ import { McpToolExecutor } from '../lib/mcp-tool-executor';
1111import { McpSessionManager } from '../lib/mcp-session-manager' ;
1212import { UnifiedToolDiscoveryManager } from '../services/unified-tool-discovery-manager' ;
1313import { DynamicConfigManager } from '../services/dynamic-config-manager' ;
14+ import { McpActivityTracker } from '../services/mcp-activity-tracker' ;
15+ import { trackMcpActivity } from '../services/activity-tracking-helper' ;
1416import { ProcessManager } from '../process' ;
1517import { McpServerConfig } from '../services/command-polling-service' ;
1618
@@ -40,6 +42,7 @@ export class InstanceRouter {
4042 private configManager : DynamicConfigManager ;
4143 private toolDiscoveryManager : UnifiedToolDiscoveryManager ;
4244 private processManager : ProcessManager ;
45+ private activityTracker ?: McpActivityTracker ;
4346
4447 constructor ( deps : {
4548 logger : FastifyBaseLogger ;
@@ -48,13 +51,15 @@ export class InstanceRouter {
4851 configManager : DynamicConfigManager ;
4952 toolDiscoveryManager : UnifiedToolDiscoveryManager ;
5053 processManager : ProcessManager ;
54+ activityTracker ?: McpActivityTracker ;
5155 } ) {
5256 this . logger = deps . logger . child ( { component : 'InstanceRouter' } ) ;
5357 this . toolExecutor = deps . toolExecutor ;
5458 this . sessionManager = deps . sessionManager ;
5559 this . configManager = deps . configManager ;
5660 this . toolDiscoveryManager = deps . toolDiscoveryManager ;
5761 this . processManager = deps . processManager ;
62+ this . activityTracker = deps . activityTracker ;
5863 }
5964
6065 /**
@@ -88,6 +93,10 @@ export class InstanceRouter {
8893 // Register tools/call handler - execute on THIS instance
8994 server . setRequestHandler ( CallToolRequestSchema , async ( request ) => {
9095 const { name : toolName , arguments : toolArgs } = request . params ;
96+ const startTime = Date . now ( ) ;
97+ let result : any ;
98+ let success = true ;
99+ let errorMessage : string | undefined ;
91100
92101 // Look up the tool in the discovery cache to get its correct namespacedName.
93102 // processId is the installation name (e.g., "duckduckgo-mcp-server-john-plhdo1j4kuit0et-..."),
@@ -117,13 +126,40 @@ export class InstanceRouter {
117126 namespaced_name : matchedTool . namespacedName
118127 } , `Executing tool ${ toolName } on instance ${ processId } ` ) ;
119128
120- const result = await this . toolExecutor . executeToolCall (
121- matchedTool . namespacedName , // e.g., "duckduckgo-mcp-server:search"
122- toolArgs || { } ,
123- processId // Force routing to this specific process
124- ) ;
129+ try {
130+ result = await this . toolExecutor . executeToolCall (
131+ matchedTool . namespacedName , // e.g., "duckduckgo-mcp-server:search"
132+ toolArgs || { } ,
133+ processId // Force routing to this specific process
134+ ) ;
125135
126- return result ;
136+ return result ;
137+ } catch ( error ) {
138+ success = false ;
139+ errorMessage = error instanceof Error ? error . message : String ( error ) ;
140+ throw error ;
141+ } finally {
142+ const responseTimeMs = Date . now ( ) - startTime ;
143+
144+ // Buffer request log (mirrors mcp-server-wrapper.ts finally block)
145+ const serverConfig = this . configManager . getMcpServerConfig ( processId ) ;
146+ const loggingEnabled = serverConfig ?. settings ?. request_logging_enabled !== false ;
147+
148+ if ( serverConfig ?. installation_id && serverConfig ?. team_id && loggingEnabled ) {
149+ this . toolExecutor . bufferRequestLogEntry ( {
150+ installation_id : serverConfig . installation_id ,
151+ team_id : serverConfig . team_id ,
152+ user_id : serverConfig . user_id ,
153+ tool_name : toolName ,
154+ tool_params : toolArgs || { } ,
155+ tool_response : result ,
156+ response_time_ms : responseTimeMs ,
157+ success,
158+ error_message : errorMessage ,
159+ timestamp : new Date ( ) . toISOString ( )
160+ } ) ;
161+ }
162+ }
127163 } ) ;
128164
129165 this . logger . info ( {
@@ -259,6 +295,16 @@ export class InstanceRouter {
259295 instance_path : instancePath ,
260296 process_id : instanceConfig . processId
261297 } , 'Instance authentication successful' ) ;
298+
299+ // Track activity for personal dashboard (same pipeline as OAuth auth)
300+ if ( this . activityTracker && instanceConfig . config . user_id && instanceConfig . config . team_id ) {
301+ trackMcpActivity ( this . activityTracker , request , {
302+ userId : instanceConfig . config . user_id ,
303+ teamId : instanceConfig . config . team_id ,
304+ authIdentifier : instanceConfig . config . installation_id || instanceConfig . processId ,
305+ authType : 'instance_token' ,
306+ } , this . logger ) ;
307+ }
262308 } ;
263309
264310 // POST /i/:instancePath/mcp - Client-to-server MCP messages
0 commit comments