Skip to content

Commit efa9046

Browse files
committed
trying a MCP fix
1 parent dd3fa2e commit efa9046

File tree

3 files changed

+53
-20
lines changed

3 files changed

+53
-20
lines changed

src/lib/server/textGeneration/mcp/runMcpFlow.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ export async function* runMcpFlow({
4343
> {
4444
// Start from env-configured servers
4545
let servers = getMcpServers();
46+
logger.debug(
47+
{ servers: servers.map((s) => ({ name: s.name, url: s.url })) },
48+
"[mcp] loaded servers from env"
49+
);
4650

4751
// Merge in request-provided custom servers (if any)
4852
try {
@@ -68,27 +72,53 @@ export async function* runMcpFlow({
6872
servers = [...byName.values()];
6973
}
7074

71-
// If the client specified a selection by name, filter to those
75+
// If the client specified a non-empty selection by name, filter to those
7276
const names = Array.isArray(reqMcp?.selectedServerNames)
7377
? reqMcp?.selectedServerNames
7478
: undefined;
75-
if (Array.isArray(names)) {
79+
if (Array.isArray(names) && names.length > 0) {
80+
logger.debug(
81+
{ selectedNames: names, beforeFilter: servers.length },
82+
"[mcp] filtering servers by name"
83+
);
7684
servers = servers.filter((s) => names.includes(s.name));
85+
logger.debug({ afterFilter: servers.length }, "[mcp] servers after name filter");
86+
} else if (Array.isArray(names) && names.length === 0) {
87+
// Be resilient: an empty array means "no explicit selection"; do not filter.
88+
logger.debug("[mcp] empty selectedServerNames provided; skipping name filter");
7789
}
7890
} catch {
7991
// ignore selection merge errors and proceed with env servers
8092
}
8193

94+
// If no servers remain after selection/merge, exit early with an accurate message
95+
if (servers.length === 0) {
96+
logger.warn("[mcp] no MCP servers available after selection; skipping MCP flow");
97+
return false;
98+
}
99+
82100
// Enforce server-side safety (public HTTPS only, no private ranges)
101+
const beforeFilter = servers.length;
83102
servers = servers.filter((s) => {
84103
try {
85-
return isValidUrl(s.url);
86-
} catch {
104+
const isValid = isValidUrl(s.url);
105+
if (!isValid) {
106+
logger.warn({ name: s.name, url: s.url }, "[mcp] server rejected by URL safety");
107+
}
108+
return isValid;
109+
} catch (err) {
110+
logger.warn(
111+
{ name: s.name, url: s.url, error: String(err) },
112+
"[mcp] server URL validation error"
113+
);
87114
return false;
88115
}
89116
});
90117
if (servers.length === 0) {
91-
logger.warn("[mcp] all selected servers rejected by URL safety guard");
118+
logger.warn(
119+
{ beforeFilter, afterFilter: servers.length },
120+
"[mcp] all servers rejected by URL safety guard"
121+
);
92122
return false;
93123
}
94124

src/lib/utils/messageUpdates.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { page } from "$app/state";
1414
import type { KeyValuePair } from "$lib/types/Tool";
1515

16-
type MessageUpdateRequestOptions = {
16+
export type MessageUpdateRequestOptions = {
1717
base: string;
1818
inputs?: string;
1919
messageId?: string;

src/routes/conversation/[id]/+page.svelte

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import { beforeNavigate, invalidateAll } from "$app/navigation";
88
import { base } from "$app/paths";
99
import { ERROR_MESSAGES, error } from "$lib/stores/errors";
10-
import { findCurrentModel } from "$lib/utils/models";
10+
import { findCurrentModel } from "$lib/utils/models";
11+
import type { MessageUpdateRequestOptions } from "$lib/utils/messageUpdates";
1112
import type { Message } from "$lib/types/Message";
1213
import { MessageUpdateStatus, MessageUpdateType } from "$lib/types/MessageUpdate";
1314
import titleUpdate from "$lib/stores/titleUpdate";
@@ -212,21 +213,23 @@
212213
213214
const messageUpdatesAbortController = new AbortController();
214215
216+
// Build payload and only include selectedMcpServerNames when non-empty
217+
const enabled = $enabledServers;
218+
const payload: MessageUpdateRequestOptions = {
219+
base,
220+
inputs: prompt,
221+
messageId,
222+
isRetry,
223+
files: isRetry ? userMessage?.files : base64Files,
224+
selectedMcpServers: enabled.map((s) => ({ name: s.name, url: s.url, headers: s.headers })),
225+
};
226+
if (enabled.length > 0) {
227+
payload.selectedMcpServerNames = enabled.map((s) => s.name);
228+
}
229+
215230
const messageUpdatesIterator = await fetchMessageUpdates(
216231
page.params.id,
217-
{
218-
base,
219-
inputs: prompt,
220-
messageId,
221-
isRetry,
222-
files: isRetry ? userMessage?.files : base64Files,
223-
selectedMcpServerNames: $enabledServers.map((s) => s.name),
224-
selectedMcpServers: $enabledServers.map((s) => ({
225-
name: s.name,
226-
url: s.url,
227-
headers: s.headers,
228-
})),
229-
},
232+
payload,
230233
messageUpdatesAbortController.signal
231234
).catch((err) => {
232235
error.set(err.message);

0 commit comments

Comments
 (0)