Skip to content

Commit 554376d

Browse files
committed
fix(mcp): preserve url and redirected when capping a response body
new Response() resets url/redirected; the SDK resolves relative auth-metadata URLs (resource_metadata) against response.url, so carry the originals over via defineProperty on the wrapped response.
1 parent 3aa9712 commit 554376d

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

apps/sim/lib/mcp/pinned-fetch.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,18 @@ describe('createGuardedMcpFetch', () => {
7575
const get = await guarded('https://mcp.example/mcp', { method: 'GET' })
7676
await expect(new Response(get.body).arrayBuffer()).resolves.toBeInstanceOf(ArrayBuffer)
7777
})
78+
79+
it('preserves url and redirected on a capped response (SDK auth-metadata resolution)', async () => {
80+
const small = new Response('{"ok":true}', { status: 200 })
81+
Object.defineProperty(small, 'url', { value: 'https://mcp.example/mcp' })
82+
Object.defineProperty(small, 'redirected', { value: true })
83+
sentinelFetch.mockImplementation(async () => small)
84+
const { fetch: guarded } = createGuardedMcpFetch()
85+
86+
const res = await guarded('https://mcp.example/mcp', { method: 'POST' })
87+
expect(res.url).toBe('https://mcp.example/mcp')
88+
expect(res.redirected).toBe(true)
89+
})
7890
})
7991

8092
describe('createSsrfGuardedMcpFetch', () => {

apps/sim/lib/mcp/pinned-fetch.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,16 @@ function capResponseBody(response: Response, maxBytes: number): Response {
7070
},
7171
})
7272
)
73-
return new Response(limited, {
73+
const wrapped = new Response(limited, {
7474
status: response.status,
7575
statusText: response.statusText,
7676
headers: response.headers,
7777
})
78+
// `new Response()` resets `url`/`redirected` (empty/false); the SDK resolves relative
79+
// auth-metadata URLs (e.g. `resource_metadata`) against `response.url`, so carry them over.
80+
Object.defineProperty(wrapped, 'url', { value: response.url, configurable: true })
81+
Object.defineProperty(wrapped, 'redirected', { value: response.redirected, configurable: true })
82+
return wrapped
7883
}
7984

8085
/**

0 commit comments

Comments
 (0)