Harden alphaXiv transport retries and logging

This commit is contained in:
Advait Paliwal 2026-03-20 23:37:38 -07:00
parent 270eaa1dc5
commit f6469556f0

View file

@ -6,6 +6,43 @@ const ALPHAXIV_MCP_URL = 'https://api.alphaxiv.org/mcp/v1';
let _client = null;
let _connected = false;
let _lastTransportLog = { message: '', time: 0 };
function getErrorMessage(err) {
if (!err) return 'Unknown error';
if (typeof err === 'string') return err;
if (err instanceof Error) return err.message || String(err);
return String(err);
}
function isTransientTransportError(err) {
const message = getErrorMessage(err);
return (
message.includes('SSE stream disconnected') ||
message.includes('Failed to open SSE stream') ||
message.includes('Failed to reconnect SSE stream') ||
message.includes('Maximum reconnection attempts') ||
message.includes('Bad Gateway') ||
message.includes('TypeError: terminated') ||
message.includes('terminated')
);
}
function logTransportError(err) {
const message = getErrorMessage(err);
if (isTransientTransportError(message)) {
const now = Date.now();
if (_lastTransportLog.message === message && now - _lastTransportLog.time < 10000) {
return;
}
_lastTransportLog = { message, time: now };
process.stderr.write(`[alpha] alphaXiv MCP transient transport issue: ${message}\n`);
return;
}
process.stderr.write(`[alpha] alphaXiv MCP error: ${message}\n`);
}
async function getClient() {
if (_client && _connected) return _client;
@ -18,7 +55,10 @@ async function getClient() {
_client = new Client({ name: 'alpha', version: '0.1.0' });
_client.onerror = (err) => {
process.stderr.write(`[alpha] alphaXiv MCP error: ${err.message || err}\n`);
if (isTransientTransportError(err)) {
_connected = false;
}
logTransportError(err);
};
const transport = new StreamableHTTPClientTransport(new URL(ALPHAXIV_MCP_URL), {
@ -36,6 +76,9 @@ async function getClient() {
}
async function callTool(name, args) {
let lastError = null;
for (let attempt = 0; attempt < 3; attempt++) {
let client;
try {
client = await getClient();
@ -54,6 +97,7 @@ async function callTool(name, args) {
}
}
try {
const result = await client.callTool({ name, arguments: args });
if (result.isError) {
@ -69,6 +113,16 @@ async function callTool(name, args) {
} catch {
return text;
}
} catch (err) {
lastError = err;
if (!isTransientTransportError(err) || attempt === 2) {
throw err;
}
await disconnect();
}
}
throw lastError ?? new Error('alphaXiv MCP call failed');
}
export async function searchByEmbedding(query) {