diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..eeeb7be --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +pnpm-lock.yaml \ No newline at end of file diff --git a/README.md b/README.md index 99b1e8a..7aebd26 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,7 @@ E.g: Claude Desktop or Windsurf "mcpServers": { "remote-example": { "command": "npx", - "args": [ - "mcp-remote", - "https://remote.mcp.server/sse" - ] + "args": ["mcp-remote", "https://remote.mcp.server/sse"] } } } @@ -23,4 +20,3 @@ E.g: Claude Desktop or Windsurf Cursor: ![image](https://github.com/user-attachments/assets/14338bfa-a779-4e8a-a477-71f72cc5d99d) - diff --git a/package.json b/package.json index 76d1b41..7b5b680 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ } }, "scripts": { - "build": "tsup" + "build": "tsup", + "check": "prettier --check . && tsc" }, "dependencies": { "express": "^4.21.2", diff --git a/src/cli/proxy.ts b/src/cli/proxy.ts index 763a9b1..60f4966 100644 --- a/src/cli/proxy.ts +++ b/src/cli/proxy.ts @@ -11,13 +11,8 @@ import { EventEmitter } from 'events' import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js' -import { - NodeOAuthClientProvider, - setupOAuthCallbackServer, - parseCommandLineArgs, - setupSignalHandlers, -} from './shared.js' -import {connectToRemoteServer, mcpProxy} from "../lib/utils.js"; +import { NodeOAuthClientProvider, setupOAuthCallbackServer, parseCommandLineArgs, setupSignalHandlers } from './shared.js' +import { connectToRemoteServer, mcpProxy } from '../lib/utils.js' /** * Main function to run the proxy diff --git a/src/cli/shared.ts b/src/cli/shared.ts index 28bc1b1..a4101aa 100644 --- a/src/cli/shared.ts +++ b/src/cli/shared.ts @@ -10,7 +10,7 @@ import path from 'path' import os from 'os' import crypto from 'crypto' import net from 'net' -import {OAuthClientProvider} from '@modelcontextprotocol/sdk/client/auth.js' +import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js' import { OAuthClientInformation, OAuthClientInformationFull, @@ -18,7 +18,7 @@ import { OAuthTokens, OAuthTokensSchema, } from '@modelcontextprotocol/sdk/shared/auth.js' -import {OAuthCallbackServerOptions, OAuthProviderOptions} from "../lib/types.js"; +import { OAuthCallbackServerOptions, OAuthProviderOptions } from '../lib/types.js' /** * Implements the OAuthClientProvider interface for Node.js environments. diff --git a/src/lib/types.ts b/src/lib/types.ts index 2201eb5..188fccb 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,4 +1,4 @@ -import {EventEmitter} from "events"; +import { EventEmitter } from 'events' /** * Options for creating an OAuth client provider @@ -28,4 +28,4 @@ export interface OAuthCallbackServerOptions { path: string /** Event emitter to signal when auth code is received */ events: EventEmitter -} \ No newline at end of file +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 2a51a47..0340315 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,24 +1,23 @@ -import { OAuthClientProvider, UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js"; -import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"; -import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; +import { OAuthClientProvider, UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js' +import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' +import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js' /** * Creates a bidirectional proxy between two transports * @param params The transport connections to proxy between */ -export function mcpProxy({transportToClient, transportToServer}: { - transportToClient: Transport; - transportToServer: Transport -}) { +export function mcpProxy({ transportToClient, transportToServer }: { transportToClient: Transport; transportToServer: Transport }) { let transportToClientClosed = false let transportToServerClosed = false transportToClient.onmessage = (message) => { + // @ts-expect-error TODO console.error('[Local→Remote]', message.method || message.id) transportToServer.send(message).catch(onServerError) } transportToServer.onmessage = (message) => { + // @ts-expect-error TODO: fix this type console.error('[Remote→Local]', message.method || message.id) transportToClient.send(message).catch(onClientError) } @@ -66,7 +65,7 @@ export async function connectToRemoteServer( ): Promise { console.error('Connecting to remote server:', serverUrl) const url = new URL(serverUrl) - const transport = new SSEClientTransport(url, {authProvider}) + const transport = new SSEClientTransport(url, { authProvider }) try { await transport.start() @@ -84,7 +83,7 @@ export async function connectToRemoteServer( await transport.finishAuth(code) // Create a new transport after auth - const newTransport = new SSEClientTransport(url, {authProvider}) + const newTransport = new SSEClientTransport(url, { authProvider }) await newTransport.start() console.error('Connected to remote server after authentication') return newTransport @@ -97,4 +96,4 @@ export async function connectToRemoteServer( throw error } } -} \ No newline at end of file +} diff --git a/src/react/index.ts b/src/react/index.ts index 1a7fef7..40948c2 100644 --- a/src/react/index.ts +++ b/src/react/index.ts @@ -534,7 +534,7 @@ export function useMcp(options: UseMcpOptions): UseMcpResult { metadataRef.current = await discoverOAuthMetadata(url) addLog('debug', `OAuth metadata: ${metadataRef.current ? 'Found' : 'Not available'}`) } - + // If metadata is found, start auth flow if (metadataRef.current) { setState('authenticating') @@ -599,7 +599,7 @@ export function useMcp(options: UseMcpOptions): UseMcpResult { } } catch (connectErr) { addLog('error', `Client connect error: ${connectErr instanceof Error ? connectErr.message : String(connectErr)}`) - + if (connectErr instanceof Error && connectErr.message.includes('Unauthorized')) { // Only discover OAuth and authenticate if we get a 401 await discoverOAuthAndAuthenticate(connectErr)