Skip to content

Commit a29b4fa

Browse files
authored
[MCP] Fix: Do not dedup by URL for MCP get_page_metadata (#84564)
The `get_page_metadata` MCP tool was incorrectly grouping browser sessions by URL instead of counting each session individually. When multiple browser tabs were open to the same URL, the tool would report only 1 session instead of the actual number of sessions.
1 parent c0cd530 commit a29b4fa

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

packages/next/src/server/mcp/tools/get-page-metadata.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,17 @@ export function registerGetPageMetadataTool(
5959
}
6060
}
6161

62-
const metadataByUrl = new Map<string, PageMetadata>()
62+
const sessionMetadata: Array<{ url: string; metadata: PageMetadata }> =
63+
[]
6364
for (const response of responses) {
6465
if (response.data) {
6566
// TODO: Add other metadata for the current page render here. Currently, we only have segment trie data.
6667
const pageMetadata = convertSegmentTrieToPageMetadata(response.data)
67-
metadataByUrl.set(response.url, pageMetadata)
68+
sessionMetadata.push({ url: response.url, metadata: pageMetadata })
6869
}
6970
}
7071

71-
if (metadataByUrl.size === 0) {
72+
if (sessionMetadata.length === 0) {
7273
return {
7374
content: [
7475
{
@@ -79,7 +80,7 @@ export function registerGetPageMetadataTool(
7980
}
8081
}
8182

82-
const output = formatPageMetadata(metadataByUrl)
83+
const output = formatPageMetadata(sessionMetadata)
8384

8485
return {
8586
content: [
@@ -145,10 +146,12 @@ function convertSegmentTrieToPageMetadata(data: SegmentTrieData): PageMetadata {
145146
}
146147
}
147148

148-
function formatPageMetadata(metadataByUrl: Map<string, PageMetadata>): string {
149-
let output = `# Page metadata from ${metadataByUrl.size} browser session(s)\n\n`
149+
function formatPageMetadata(
150+
sessionMetadata: Array<{ url: string; metadata: PageMetadata }>
151+
): string {
152+
let output = `# Page metadata from ${sessionMetadata.length} browser session(s)\n\n`
150153

151-
for (const [url, metadata] of metadataByUrl) {
154+
for (const { url, metadata } of sessionMetadata) {
152155
let displayUrl = url
153156
try {
154157
const urlObj = new URL(url)

test/development/mcp-server/mcp-server-get-page-metadata.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,33 @@ describe('mcp-server get_page_metadata tool', () => {
180180
await session2.close()
181181
}
182182
})
183+
184+
it('should count multiple browser tabs with the same URL separately', async () => {
185+
await new Promise((resolve) => setTimeout(resolve, 500))
186+
187+
const session1 = await launchStandaloneSession(next.url, '/')
188+
const session2 = await launchStandaloneSession(next.url, '/')
189+
190+
try {
191+
await new Promise((resolve) => setTimeout(resolve, 1000))
192+
193+
let metadata: string = ''
194+
await retry(async () => {
195+
const sessionId = 'test-same-url-' + Date.now()
196+
metadata = await callGetPageMetadata(next.url, sessionId)
197+
const rootSessions = (metadata.match(/## Session: \/(?!\w)/g) || [])
198+
.length
199+
expect(rootSessions).toBeGreaterThanOrEqual(2)
200+
})
201+
202+
const rootSessions = (metadata.match(/## Session: \/(?!\w)/g) || [])
203+
.length
204+
expect(rootSessions).toBeGreaterThanOrEqual(2)
205+
} finally {
206+
await session1.close()
207+
await session2.close()
208+
}
209+
})
183210
})
184211

185212
describe('pages router', () => {

0 commit comments

Comments
 (0)