mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 18:19:43 +00:00
- 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>
83 lines
2.4 KiB
TypeScript
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);
|
|
});
|