55 */
66import type { ConsoleMessage , ResourceType } from 'puppeteer-core' ;
77
8- import { formatConsoleEvent } from './formatters/consoleFormatter.js' ;
8+ import {
9+ formatConsoleEventShort ,
10+ formatConsoleEventVerbose ,
11+ } from './formatters/consoleFormatter.js' ;
912import {
1013 getFormattedHeaderValue ,
1114 getFormattedResponseBody ,
@@ -31,16 +34,18 @@ interface NetworkRequestData {
3134}
3235
3336export interface ConsoleMessageData {
34- type : string ;
35- message : string ;
36- args : string [ ] ;
37+ consoleMessageStableId : number ;
38+ type ?: string ;
39+ message ?: string ;
40+ args ?: string [ ] ;
3741}
3842
3943export class McpResponse implements Response {
4044 #includePages = false ;
4145 #includeSnapshot = false ;
4246 #includeVerboseSnapshot = false ;
4347 #attachedNetworkRequestData?: NetworkRequestData ;
48+ #attachedConsoleMessageData?: ConsoleMessageData ;
4449 #consoleMessagesData?: ConsoleMessageData [ ] ;
4550 #textResponseLines: string [ ] = [ ] ;
4651 #images: ImageContentData [ ] = [ ] ;
@@ -118,6 +123,12 @@ export class McpResponse implements Response {
118123 } ;
119124 }
120125
126+ attachConsoleMessage ( id : number ) : void {
127+ this . #attachedConsoleMessageData = {
128+ consoleMessageStableId : id ,
129+ } ;
130+ }
131+
121132 get includePages ( ) : boolean {
122133 return this . #includePages;
123134 }
@@ -192,14 +203,62 @@ export class McpResponse implements Response {
192203 }
193204 }
194205
206+ if ( this . #attachedConsoleMessageData?. consoleMessageStableId ) {
207+ const message = context . getConsoleMessageById (
208+ this . #attachedConsoleMessageData. consoleMessageStableId ,
209+ ) ;
210+ const consoleMessageStableId =
211+ this . #attachedConsoleMessageData. consoleMessageStableId ;
212+ let data : ConsoleMessageData ;
213+ if ( 'args' in message ) {
214+ const consoleMessage = message as ConsoleMessage ;
215+ data = {
216+ consoleMessageStableId,
217+ type : consoleMessage . type ( ) ,
218+ message : consoleMessage . text ( ) ,
219+ args : await Promise . all (
220+ consoleMessage . args ( ) . map ( async arg => {
221+ const stringArg = await arg . jsonValue ( ) . catch ( ( ) => {
222+ // Ignore errors.
223+ } ) ;
224+ return typeof stringArg === 'object'
225+ ? JSON . stringify ( stringArg )
226+ : String ( stringArg ) ;
227+ } ) ,
228+ ) ,
229+ } ;
230+ } else {
231+ data = {
232+ consoleMessageStableId,
233+ type : 'error' ,
234+ message : ( message as Error ) . message ,
235+ args : [ ] ,
236+ } ;
237+ }
238+ this . #attachedConsoleMessageData = data ;
239+ }
240+
195241 if ( this . #consoleDataOptions?. include ) {
196- const messages = context . getConsoleData ( ) ;
242+ let messages = context . getConsoleData ( ) ;
243+
244+ if ( this . #consoleDataOptions. types ?. length ) {
245+ const normalizedTypes = new Set ( this . #consoleDataOptions. types ) ;
246+ messages = messages . filter ( message => {
247+ if ( 'type' in message ) {
248+ return normalizedTypes . has ( message . type ( ) ) ;
249+ }
250+ return normalizedTypes . has ( 'error' ) ;
251+ } ) ;
252+ }
197253
198254 this . #consoleMessagesData = await Promise . all (
199255 messages . map ( async ( item ) : Promise < ConsoleMessageData > => {
256+ const consoleMessageStableId =
257+ context . getConsoleMessageStableId ( item ) ;
200258 if ( 'args' in item ) {
201259 const consoleMessage = item as ConsoleMessage ;
202260 return {
261+ consoleMessageStableId,
203262 type : consoleMessage . type ( ) ,
204263 message : consoleMessage . text ( ) ,
205264 args : await Promise . all (
@@ -215,6 +274,7 @@ export class McpResponse implements Response {
215274 } ;
216275 }
217276 return {
277+ consoleMessageStableId,
218278 type : 'error' ,
219279 message : ( item as Error ) . message ,
220280 args : [ ] ,
@@ -283,6 +343,7 @@ Call ${handleDialog.name} to handle it before continuing.`);
283343 }
284344
285345 response . push ( ...this . #getIncludeNetworkRequestsData( context ) ) ;
346+ response . push ( ...this . #getAttachedConsoleMessageData( ) ) ;
286347
287348 if ( this . #networkRequestsOptions?. include ) {
288349 let requests = context . getNetworkRequests ( ) ;
@@ -329,7 +390,7 @@ Call ${handleDialog.name} to handle it before continuing.`);
329390 ) ;
330391 response . push ( ...data . info ) ;
331392 response . push (
332- ...data . items . map ( message => formatConsoleEvent ( message ) ) ,
393+ ...data . items . map ( message => formatConsoleEventShort ( message ) ) ,
333394 ) ;
334395 } else {
335396 response . push ( '<no console messages found>' ) ;
@@ -376,6 +437,18 @@ Call ${handleDialog.name} to handle it before continuing.`);
376437 } ;
377438 }
378439
440+ #getAttachedConsoleMessageData( ) : string [ ] {
441+ const response : string [ ] = [ ] ;
442+ const data = this . #attachedConsoleMessageData;
443+ if ( ! data ) {
444+ return response ;
445+ }
446+
447+ response . push ( `## Console Message ${ data . consoleMessageStableId } ` ) ;
448+ response . push ( formatConsoleEventVerbose ( data ) ) ;
449+ return response ;
450+ }
451+
379452 #getIncludeNetworkRequestsData( context : McpContext ) : string [ ] {
380453 const response : string [ ] = [ ] ;
381454 const url = this . #attachedNetworkRequestData?. networkRequestStableId ;
0 commit comments