Skip to content

Commit 9043b7e

Browse files
committed
fix(mcp): verify racing refresh success
1 parent 253c471 commit 9043b7e

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

apps/sim/app/api/mcp/servers/[id]/refresh/route.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,32 @@ describe('MCP server refresh route', () => {
164164
expect(mockClearCache).not.toHaveBeenCalled()
165165
})
166166

167+
it('reports the discovery failure when only cache invalidation advanced', async () => {
168+
mockDiscoverServerTools.mockRejectedValueOnce(new Error('Connection failed'))
169+
const cacheInvalidatedServer = {
170+
...initialServer,
171+
lastToolsRefresh: new Date(initialServer.lastToolsRefresh.getTime() + 60_000),
172+
toolCount: 0,
173+
}
174+
mockSelect.mockReturnValueOnce(selectRows([cacheInvalidatedServer]))
175+
176+
const request = new Request('http://localhost/api/mcp/servers/server-1/refresh', {
177+
method: 'POST',
178+
}) as NextRequest
179+
const response = await POST(request, { params: Promise.resolve({ id: 'server-1' }) })
180+
const body = await response.json()
181+
182+
expect(body.data).toEqual(
183+
expect.objectContaining({
184+
status: 'disconnected',
185+
error: 'Internal server error',
186+
toolCount: 0,
187+
workflowsUpdated: 0,
188+
})
189+
)
190+
expect(mockClearCache).not.toHaveBeenCalled()
191+
})
192+
167193
it('does not 500 when workflow sync fails after a successful discovery', async () => {
168194
mockDiscoverServerTools.mockResolvedValueOnce({
169195
tools: [

apps/sim/app/api/mcp/servers/[id]/refresh/route.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,9 @@ export const POST = withRouteHandler(
273273
const newerSuccessWonRace =
274274
refreshedServer?.lastToolsRefresh != null &&
275275
(server.lastToolsRefresh == null ||
276-
refreshedServer.lastToolsRefresh > server.lastToolsRefresh)
276+
refreshedServer.lastToolsRefresh > server.lastToolsRefresh) &&
277+
refreshedServer.lastConnected != null &&
278+
(server.lastConnected == null || refreshedServer.lastConnected > server.lastConnected)
277279

278280
if (!newerSuccessWonRace) {
279281
connectionStatus = 'disconnected'

0 commit comments

Comments
 (0)