Revert "trying a MCP fix"
Browse filesThis reverts commit efa904667a5df27223f8f74b11a186a711c8987a.
src/lib/server/textGeneration/mcp/runMcpFlow.ts
CHANGED
|
@@ -43,10 +43,6 @@ export async function* runMcpFlow({
|
|
| 43 |
> {
|
| 44 |
// Start from env-configured servers
|
| 45 |
let servers = getMcpServers();
|
| 46 |
-
logger.debug(
|
| 47 |
-
{ servers: servers.map((s) => ({ name: s.name, url: s.url })) },
|
| 48 |
-
"[mcp] loaded servers from env"
|
| 49 |
-
);
|
| 50 |
|
| 51 |
// Merge in request-provided custom servers (if any)
|
| 52 |
try {
|
|
@@ -72,53 +68,27 @@ export async function* runMcpFlow({
|
|
| 72 |
servers = [...byName.values()];
|
| 73 |
}
|
| 74 |
|
| 75 |
-
// If the client specified a
|
| 76 |
const names = Array.isArray(reqMcp?.selectedServerNames)
|
| 77 |
? reqMcp?.selectedServerNames
|
| 78 |
: undefined;
|
| 79 |
-
if (Array.isArray(names)
|
| 80 |
-
logger.debug(
|
| 81 |
-
{ selectedNames: names, beforeFilter: servers.length },
|
| 82 |
-
"[mcp] filtering servers by name"
|
| 83 |
-
);
|
| 84 |
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");
|
| 89 |
}
|
| 90 |
} catch {
|
| 91 |
// ignore selection merge errors and proceed with env servers
|
| 92 |
}
|
| 93 |
|
| 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 |
-
|
| 100 |
// Enforce server-side safety (public HTTPS only, no private ranges)
|
| 101 |
-
const beforeFilter = servers.length;
|
| 102 |
servers = servers.filter((s) => {
|
| 103 |
try {
|
| 104 |
-
|
| 105 |
-
|
| 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 |
-
);
|
| 114 |
return false;
|
| 115 |
}
|
| 116 |
});
|
| 117 |
if (servers.length === 0) {
|
| 118 |
-
logger.warn(
|
| 119 |
-
{ beforeFilter, afterFilter: servers.length },
|
| 120 |
-
"[mcp] all servers rejected by URL safety guard"
|
| 121 |
-
);
|
| 122 |
return false;
|
| 123 |
}
|
| 124 |
|
|
|
|
| 43 |
> {
|
| 44 |
// Start from env-configured servers
|
| 45 |
let servers = getMcpServers();
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
// Merge in request-provided custom servers (if any)
|
| 48 |
try {
|
|
|
|
| 68 |
servers = [...byName.values()];
|
| 69 |
}
|
| 70 |
|
| 71 |
+
// If the client specified a selection by name, filter to those
|
| 72 |
const names = Array.isArray(reqMcp?.selectedServerNames)
|
| 73 |
? reqMcp?.selectedServerNames
|
| 74 |
: undefined;
|
| 75 |
+
if (Array.isArray(names)) {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
servers = servers.filter((s) => names.includes(s.name));
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
}
|
| 78 |
} catch {
|
| 79 |
// ignore selection merge errors and proceed with env servers
|
| 80 |
}
|
| 81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
// Enforce server-side safety (public HTTPS only, no private ranges)
|
|
|
|
| 83 |
servers = servers.filter((s) => {
|
| 84 |
try {
|
| 85 |
+
return isValidUrl(s.url);
|
| 86 |
+
} catch {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
return false;
|
| 88 |
}
|
| 89 |
});
|
| 90 |
if (servers.length === 0) {
|
| 91 |
+
logger.warn("[mcp] all selected servers rejected by URL safety guard");
|
|
|
|
|
|
|
|
|
|
| 92 |
return false;
|
| 93 |
}
|
| 94 |
|
src/lib/utils/messageUpdates.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
| 13 |
import { page } from "$app/state";
|
| 14 |
import type { KeyValuePair } from "$lib/types/Tool";
|
| 15 |
|
| 16 |
-
|
| 17 |
base: string;
|
| 18 |
inputs?: string;
|
| 19 |
messageId?: string;
|
|
|
|
| 13 |
import { page } from "$app/state";
|
| 14 |
import type { KeyValuePair } from "$lib/types/Tool";
|
| 15 |
|
| 16 |
+
type MessageUpdateRequestOptions = {
|
| 17 |
base: string;
|
| 18 |
inputs?: string;
|
| 19 |
messageId?: string;
|
src/routes/conversation/[id]/+page.svelte
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
import { beforeNavigate, invalidateAll } from "$app/navigation";
|
| 8 |
import { base } from "$app/paths";
|
| 9 |
import { ERROR_MESSAGES, error } from "$lib/stores/errors";
|
| 10 |
-
|
| 11 |
-
import type { MessageUpdateRequestOptions } from "$lib/utils/messageUpdates";
|
| 12 |
import type { Message } from "$lib/types/Message";
|
| 13 |
import { MessageUpdateStatus, MessageUpdateType } from "$lib/types/MessageUpdate";
|
| 14 |
import titleUpdate from "$lib/stores/titleUpdate";
|
|
@@ -213,23 +212,21 @@
|
|
| 213 |
|
| 214 |
const messageUpdatesAbortController = new AbortController();
|
| 215 |
|
| 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 |
-
|
| 230 |
const messageUpdatesIterator = await fetchMessageUpdates(
|
| 231 |
page.params.id,
|
| 232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
messageUpdatesAbortController.signal
|
| 234 |
).catch((err) => {
|
| 235 |
error.set(err.message);
|
|
|
|
| 7 |
import { beforeNavigate, invalidateAll } from "$app/navigation";
|
| 8 |
import { base } from "$app/paths";
|
| 9 |
import { ERROR_MESSAGES, error } from "$lib/stores/errors";
|
| 10 |
+
import { findCurrentModel } from "$lib/utils/models";
|
|
|
|
| 11 |
import type { Message } from "$lib/types/Message";
|
| 12 |
import { MessageUpdateStatus, MessageUpdateType } from "$lib/types/MessageUpdate";
|
| 13 |
import titleUpdate from "$lib/stores/titleUpdate";
|
|
|
|
| 212 |
|
| 213 |
const messageUpdatesAbortController = new AbortController();
|
| 214 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 215 |
const messageUpdatesIterator = await fetchMessageUpdates(
|
| 216 |
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 |
+
},
|
| 230 |
messageUpdatesAbortController.signal
|
| 231 |
).catch((err) => {
|
| 232 |
error.set(err.message);
|