Files
Sauci/apps/mcp/src/bridge.ts
T
jjbruntonandClaude Opus 4.5 3009e80dd4 Add drag-and-drop reordering to categories page
- Replace up/down chevron buttons with @dnd-kit drag handles
- Update pack generation and question review commands
- Fix MCP bridge and add supabase package.json for Docker

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 21:19:36 +00:00

83 lines
2.4 KiB
TypeScript

import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
const args = process.argv.slice(2);
const urlArg = args.find(a => a.startsWith('--url='));
const keyArg = args.find(a => a.startsWith('--key='));
if (!urlArg || !keyArg) {
console.error('Usage: node bridge.js --url=<url> --key=<key>');
process.exit(1);
}
const url = new URL(urlArg.split('=')[1]);
const apiKey = keyArg.split('=')[1];
async function run() {
console.error(`[Bridge] Connecting to ${url.href}`);
console.error(`[Bridge] Using API Key (length: ${apiKey.length})`);
const local = new StdioServerTransport();
const remote = new StreamableHTTPClientTransport(url, {
requestInit: {
headers: {
'Authorization': `Bearer ${apiKey}`,
'Accept': 'application/json, text/event-stream'
}
}
});
// Bridge messages from Claude Desktop to remote server
local.onmessage = async (message) => {
console.error(`[Bridge] -> Remote: ${JSON.stringify(message).slice(0, 100)}...`);
try {
await remote.send(message);
} catch (err) {
console.error('[Bridge] Failed to forward message to remote:', err);
}
};
// Bridge messages from remote server to Claude Desktop
remote.onmessage = async (message) => {
console.error(`[Bridge] <- Remote: ${JSON.stringify(message).slice(0, 100)}...`);
try {
await local.send(message);
} catch (err) {
console.error('[Bridge] Failed to forward message to local:', err);
}
};
remote.onerror = (err) => {
console.error('[Bridge] Remote transport error:', err);
};
local.onerror = (err) => {
console.error('[Bridge] Local transport error:', err);
process.exit(1);
};
local.onclose = () => {
console.error('[Bridge] Local transport closed');
process.exit(0);
};
remote.onclose = () => {
console.error('[Bridge] Remote transport closed');
};
// Start both transports
console.error('[Bridge] Starting remote transport...');
await remote.start();
console.error('[Bridge] Remote transport started');
console.error('[Bridge] Starting local transport...');
await local.start();
console.error('[Bridge] Local transport started - ready for messages');
}
run().catch(err => {
console.error('[Bridge] Fatal error:', err);
process.exit(1);
});