fix(frontend): Add response status narrowing for generated MCP API types

The generated API functions return discriminated union types (success |
error). Add status checks to narrow the type before accessing
success-specific fields, and convert null to undefined for
CredentialsMetaResponse compatibility.
This commit is contained in:
Zamil Majdy
2026-02-12 19:28:57 +04:00
parent 2dd09943cb
commit 8663d7a5ba
3 changed files with 16 additions and 3 deletions

View File

@@ -114,6 +114,7 @@ export function MCPToolDialog({
server_url: url,
auth_token: authToken || null,
});
if (response.status !== 200) throw response.data;
setTools(response.data.tools);
setServerName(response.data.server_name ?? null);
setAuthRequired(false);
@@ -157,6 +158,7 @@ export function MCPToolDialog({
const loginResponse = await postV2InitiateOauthLoginForAnMcpServer({
server_url: serverUrl.trim(),
});
if (loginResponse.status !== 200) throw loginResponse.data;
const { login_url, state_token } = loginResponse.data;
const { promise, cleanup } = openOAuthPopup(login_url, {
@@ -183,6 +185,7 @@ export function MCPToolDialog({
code: result.code,
state_token,
});
if (cbResponse.status !== 200) throw cbResponse.data;
callbackResult = cbResponse.data;
}
@@ -198,6 +201,7 @@ export function MCPToolDialog({
const toolsResponse = await postV2DiscoverAvailableToolsOnAnMcpServer({
server_url: serverUrl.trim(),
});
if (toolsResponse.status !== 200) throw toolsResponse.data;
setTools(toolsResponse.data.tools);
setServerName(toolsResponse.data.server_name ?? null);
setStep("tool");
@@ -422,8 +426,9 @@ function MCPToolCard({
onSelect: () => void;
}) {
const [expanded, setExpanded] = useState(false);
const properties = tool.input_schema?.properties ?? {};
const required = new Set<string>(tool.input_schema?.required ?? []);
const schema = tool.input_schema as Record<string, any>;
const properties = schema?.properties ?? {};
const required = new Set<string>(schema?.required ?? []);
const paramNames = Object.keys(properties);
// Strip XML-like tags from description for cleaner display.

View File

@@ -187,6 +187,7 @@ export function useCredentialsInput({
const mcpLoginResponse = await postV2InitiateOauthLoginForAnMcpServer({
server_url: discriminatorValue!,
});
if (mcpLoginResponse.status !== 200) throw mcpLoginResponse.data;
({ login_url, state_token } = mcpLoginResponse.data);
} else {
({ login_url, state_token } = await api.oAuthLogin(

View File

@@ -137,7 +137,14 @@ export default function CredentialsProvider({
code,
state_token,
});
const credsMeta = response.data;
if (response.status !== 200) throw response.data;
const credsMeta: CredentialsMetaResponse = {
...response.data,
title: response.data.title ?? undefined,
scopes: response.data.scopes ?? undefined,
username: response.data.username ?? undefined,
host: response.data.host ?? undefined,
};
addCredentials("mcp", credsMeta);
return credsMeta;
} catch (error) {