@@ -7,7 +7,7 @@ import type {
77 ImageContent ,
88 TextContent ,
99} from '@modelcontextprotocol/sdk/types.js' ;
10- import type { ResourceType } from 'puppeteer-core' ;
10+ import type { ConsoleMessage , ResourceType } from 'puppeteer-core' ;
1111
1212import { formatConsoleEvent } from './formatters/consoleFormatter.js' ;
1313import {
@@ -29,20 +29,30 @@ interface NetworkRequestData {
2929 responseBody ?: string ;
3030}
3131
32+ export interface ConsoleMessageData {
33+ type : string ;
34+ message : string ;
35+ args : string [ ] ;
36+ }
37+
3238export class McpResponse implements Response {
3339 #includePages = false ;
3440 #includeSnapshot = false ;
3541 #includeVerboseSnapshot = false ;
3642 #attachedNetworkRequestData?: NetworkRequestData ;
37- #includeConsoleData = false ;
43+ #consoleMessagesData?: ConsoleMessageData [ ] ;
3844 #textResponseLines: string [ ] = [ ] ;
39- #formattedConsoleData?: string [ ] ;
4045 #images: ImageContentData [ ] = [ ] ;
4146 #networkRequestsOptions?: {
4247 include : boolean ;
4348 pagination ?: PaginationOptions ;
4449 resourceTypes ?: ResourceType [ ] ;
4550 } ;
51+ #consoleDataOptions?: {
52+ include : boolean ;
53+ pagination ?: PaginationOptions ;
54+ types ?: string [ ] ;
55+ } ;
4656
4757 setIncludePages ( value : boolean ) : void {
4858 this . #includePages = value ;
@@ -79,8 +89,30 @@ export class McpResponse implements Response {
7989 } ;
8090 }
8191
82- setIncludeConsoleData ( value : boolean ) : void {
83- this . #includeConsoleData = value ;
92+ setIncludeConsoleData (
93+ value : boolean ,
94+ options ?: {
95+ pageSize ?: number ;
96+ pageIdx ?: number ;
97+ types ?: string [ ] ;
98+ } ,
99+ ) : void {
100+ if ( ! value ) {
101+ this . #consoleDataOptions = undefined ;
102+ return ;
103+ }
104+
105+ this . #consoleDataOptions = {
106+ include : value ,
107+ pagination :
108+ options ?. pageSize || options ?. pageIdx
109+ ? {
110+ pageSize : options . pageSize ,
111+ pageIdx : options . pageIdx ,
112+ }
113+ : undefined ,
114+ types : options ?. types ,
115+ } ;
84116 }
85117
86118 attachNetworkRequest ( reqid : number ) : void {
@@ -98,14 +130,20 @@ export class McpResponse implements Response {
98130 }
99131
100132 get includeConsoleData ( ) : boolean {
101- return this . #includeConsoleData ;
133+ return this . #consoleDataOptions ?. include ?? false ;
102134 }
103135 get attachedNetworkRequestId ( ) : number | undefined {
104136 return this . #attachedNetworkRequestData?. networkRequestStableId ;
105137 }
106138 get networkRequestsPageIdx ( ) : number | undefined {
107139 return this . #networkRequestsOptions?. pagination ?. pageIdx ;
108140 }
141+ get consoleMessagesPageIdx ( ) : number | undefined {
142+ return this . #consoleDataOptions?. pagination ?. pageIdx ;
143+ }
144+ get consoleMessagesTypes ( ) : string [ ] | undefined {
145+ return this . #consoleDataOptions?. types ;
146+ }
109147
110148 appendResponseLine ( value : string ) : void {
111149 this . #textResponseLines. push ( value ) ;
@@ -142,8 +180,6 @@ export class McpResponse implements Response {
142180 await context . createTextSnapshot ( this . #includeVerboseSnapshot) ;
143181 }
144182
145- let formattedConsoleMessages : string [ ] ;
146-
147183 if ( this . #attachedNetworkRequestData?. networkRequestStableId ) {
148184 const request = context . getNetworkRequestById (
149185 this . #attachedNetworkRequestData. networkRequestStableId ,
@@ -159,14 +195,35 @@ export class McpResponse implements Response {
159195 }
160196 }
161197
162- if ( this . #includeConsoleData) {
163- const consoleMessages = context . getConsoleData ( ) ;
164- if ( consoleMessages ) {
165- formattedConsoleMessages = await Promise . all (
166- consoleMessages . map ( message => formatConsoleEvent ( message ) ) ,
167- ) ;
168- this . #formattedConsoleData = formattedConsoleMessages ;
169- }
198+ if ( this . #consoleDataOptions?. include ) {
199+ const messages = context . getConsoleData ( ) ;
200+
201+ this . #consoleMessagesData = await Promise . all (
202+ messages . map ( async ( item ) : Promise < ConsoleMessageData > => {
203+ if ( 'args' in item ) {
204+ const consoleMessage = item as ConsoleMessage ;
205+ return {
206+ type : consoleMessage . type ( ) ,
207+ message : consoleMessage . text ( ) ,
208+ args : await Promise . all (
209+ consoleMessage . args ( ) . map ( async arg => {
210+ const stringArg = await arg . jsonValue ( ) . catch ( ( ) => {
211+ // Ignore errors.
212+ } ) ;
213+ return typeof stringArg === 'object'
214+ ? JSON . stringify ( stringArg )
215+ : String ( stringArg ) ;
216+ } ) ,
217+ ) ,
218+ } ;
219+ }
220+ return {
221+ type : 'error' ,
222+ message : ( item as Error ) . message ,
223+ args : [ ] ,
224+ } ;
225+ } ) ,
226+ ) ;
170227 }
171228
172229 return this . format ( toolName , context ) ;
@@ -264,10 +321,19 @@ Call ${handleDialog.name} to handle it before continuing.`);
264321 }
265322 }
266323
267- if ( this . #includeConsoleData && this . #formattedConsoleData) {
324+ if ( this . #consoleDataOptions?. include ) {
325+ const messages = this . #consoleMessagesData ?? [ ] ;
326+
268327 response . push ( '## Console messages' ) ;
269- if ( this . #formattedConsoleData. length ) {
270- response . push ( ...this . #formattedConsoleData) ;
328+ if ( messages . length ) {
329+ const data = this . #dataWithPagination(
330+ messages ,
331+ this . #consoleDataOptions. pagination ,
332+ ) ;
333+ response . push ( ...data . info ) ;
334+ response . push (
335+ ...data . items . map ( message => formatConsoleEvent ( message ) ) ,
336+ ) ;
271337 } else {
272338 response . push ( '<no console messages found>' ) ;
273339 }
0 commit comments