mastra-ai/mastra · error · HTTPException

Failed to resolve updated MCP client

Error message

Failed to resolve updated MCP client

What it means

This HTTP 500 is thrown by the stored-MCP-clients update handler after it persists the update and then tries to re-fetch the record in its resolved (draft) form via mcpClientStore.getByIdResolved(). If that lookup returns null even though the update just succeeded, the server treats it as an internal consistency failure and throws. It is not a client-input problem; it indicates the storage layer failed to return the just-written record.

Source

Thrown at packages/server/src/server/handlers/stored-mcp-clients.ts:258

      const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== undefined));

      // Handle auto-versioning with retry logic for race conditions
      // This creates a new version if there are meaningful config changes.
      // It does NOT update activeVersionId — the version stays as a draft until explicitly published.
      await handleAutoVersioning(
        mcpClientStore as unknown as VersionedStoreInterface,
        storedMCPClientId,
        'mcpClientId',
        MCP_CLIENT_SNAPSHOT_CONFIG_FIELDS,
        existing,
        updatedMCPClient,
        providedConfigFields,
      );

      // Return the resolved MCP client with the latest (draft) version so the UI sees its edits
      const resolved = await mcpClientStore.getByIdResolved(storedMCPClientId, { status: 'draft' });
      if (!resolved) {
        throw new HTTPException(500, { message: 'Failed to resolve updated MCP client' });
      }

      return resolved;
    } catch (error) {
      return handleError(error, 'Error updating stored MCP client');
    }
  },
});

/**
 * DELETE /stored/mcp-clients/:storedMCPClientId - Delete a stored MCP client
 */
export const DELETE_STORED_MCP_CLIENT_ROUTE = createRoute({
  method: 'DELETE',
  path: '/stored/mcp-clients/:storedMCPClientId',
  responseType: 'json',
  pathParamSchema: storedMCPClientIdPathParams,
  responseSchema: deleteStoredMCPClientResponseSchema,

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Retry the request; transient read-after-write gaps usually resolve on a second call
  2. Verify your storage adapter fully implements the mcpClients domain, including getByIdResolved with status filtering
  3. Check logs for a concurrent delete or scope assertion failing on the same client id
  4. Upgrade @mastra/core storage packages to the latest version to pick up domain fixes

Example fix

null
Defensive patterns

Strategy: retry

Validate before calling

const storage = mastra.getStorage();
if (!storage) throw new Error('storage not configured');
const store = await storage.getStore('mcpClients');
if (!store) throw new Error('mcpClients domain unavailable');

Type guard

function hasResolved<T>(r: T | null | undefined): r is T { return r != null; }

Try / catch

try {
  const resolved = await store.getByIdResolved(id, { status: 'draft' });
  if (!resolved) throw new Error('resolve-after-update returned null');
} catch (e) {
  // retry once, then inspect storage adapter support for getByIdResolved
}

Prevention

When it happens

Trigger: PUT/PATCH to the stored MCP clients endpoint where the update succeeded but getByIdResolved(id, { status: 'draft' }) returned null — e.g. the storage adapter's getStore('mcpClients') domain implements getByIdResolved incorrectly, a storage backend replication/consistency lag, or the record was deleted between update and re-read (e.g. concurrent request or scope-filtered resolution).

Common situations: Custom or beta storage adapters with incomplete 'mcpClients' domain implementations; running against in-memory storage that was swapped mid-request; concurrent DELETE racing the update; storage backends with read-after-write consistency gaps.

Related errors


AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30). Data as JSON: /api/errors/441060a306ad893b. Report an issue: GitHub.