b2497f1327
- background_output: snapshot read cursor before consuming, restore on /undo message removal so re-reads return data (fixes #2915) - MCP loader: preserve oauth field in transformMcpServer, add scope/ projectPath filtering so local-scoped MCPs only load in matching directories (fixes #2917) - runtime-fallback: add 'reached your usage limit' to retryable error patterns so quota exhaustion triggers model fallback (fixes #2918) Verified: bun test (4606 pass / 0 fail), tsc --noEmit clean
58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
import type {
|
|
ClaudeCodeMcpServer,
|
|
McpLocalConfig,
|
|
McpRemoteConfig,
|
|
McpServerConfig,
|
|
} from "./types"
|
|
import { expandEnvVarsInObject } from "./env-expander"
|
|
|
|
export function transformMcpServer(
|
|
name: string,
|
|
server: ClaudeCodeMcpServer
|
|
): McpServerConfig {
|
|
const expanded = expandEnvVarsInObject(server)
|
|
const serverType = expanded.type ?? "stdio"
|
|
|
|
if (serverType === "http" || serverType === "sse") {
|
|
if (!expanded.url) {
|
|
throw new Error(
|
|
`MCP server "${name}" requires url for type "${serverType}"`
|
|
)
|
|
}
|
|
|
|
const config: McpRemoteConfig = {
|
|
type: "remote",
|
|
url: expanded.url,
|
|
enabled: true,
|
|
}
|
|
|
|
if (expanded.headers && Object.keys(expanded.headers).length > 0) {
|
|
config.headers = expanded.headers
|
|
}
|
|
|
|
if (expanded.oauth && Object.keys(expanded.oauth).length > 0) {
|
|
config.oauth = expanded.oauth
|
|
}
|
|
|
|
return config
|
|
}
|
|
|
|
if (!expanded.command) {
|
|
throw new Error(`MCP server "${name}" requires command for stdio type`)
|
|
}
|
|
|
|
const commandArray = [expanded.command, ...(expanded.args ?? [])]
|
|
|
|
const config: McpLocalConfig = {
|
|
type: "local",
|
|
command: commandArray,
|
|
enabled: true,
|
|
}
|
|
|
|
if (expanded.env && Object.keys(expanded.env).length > 0) {
|
|
config.environment = expanded.env
|
|
}
|
|
|
|
return config
|
|
}
|