Skip to main content
Glama
PoliTwit1984

Second Opinion MCP Server

by PoliTwit1984

두 번째 의견 MCP 서버

다음의 통찰력을 결합하여 코딩 문제에 대한 AI 기반 지원을 제공하는 MCP 서버:

  • 구글의 제미니 AI

  • Stack Overflow에서 수락된 답변

  • Perplexity AI 분석

특징

  • 다양한 소스의 컨텍스트를 통해 코딩 문제에 대한 자세한 솔루션을 얻으세요

  • 파일 확장자에서 자동 언어 감지

  • 코드 조각 추출 및 서식 지정

  • 솔루션을 위한 마크다운 보고서 생성

  • Git 인식 파일 컨텍스트 수집

Related MCP server: Claude Code + Gemini MCP Server

설정

  1. 종속성 설치:

지엑스피1

  1. 서버를 빌드하세요:

npm run build
  1. MCP 설정에서 환경 변수를 구성합니다.

{
  "mcpServers": {
    "second-opinion": {
      "command": "node",
      "args": ["/path/to/second-opinion-server/build/index.js"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-api-key",
        "PERPLEXITY_API_KEY": "your-perplexity-api-key",
        "STACK_EXCHANGE_KEY": "your-stack-exchange-key"
      }
    }
  }
}

필수 환경 변수:

  • GEMINI_API_KEY : Google의 Gemini AI API 키

  • PERPLEXITY_API_KEY : Perplexity AI API 키

  • STACK_EXCHANGE_KEY : Stack Exchange API 키(선택 사항, 제공하지 않으면 익명 액세스 사용)

용법

서버는 단일 도구를 제공합니다.

두 번째 의견을 얻으세요

코딩 문제에 대한 AI 기반 통찰력과 솔루션을 얻으세요.

입력 스키마:

{
  "goal": "string (required) - What you're trying to accomplish",
  "error": "string (optional) - Any error messages you're seeing",
  "code": "string (optional) - Relevant code context",
  "solutionsTried": "string (optional) - What solutions you've already tried",
  "filePath": "string (optional) - Path to the file with the issue"
}

입력 예시:

{
  "goal": "Fix React useEffect cleanup error",
  "error": "React Hook useEffect has a missing dependency: 'socket'. Either include it in the dependency array, or remove the dependency array  react-hooks/exhaustive-deps",
  "code": "useEffect(() => {\n  socket.on('message', handleMessage);\n  return () => socket.off('message');\n}, []);",
  "solutionsTried": "I tried adding socket to the dependency array but then it causes infinite re-renders"
}

응답 예시:

문제 이해

핵심 문제는 React의 useEffect 훅이 부작용과 그 종속성을 관리하는 방식에 있습니다. 빈 종속성 배열( [] )을 제공하면 React에게 컴포넌트가 마운트될 때 효과가 한 번만 실행되고, 컴포넌트가 언마운트될 때 정리 함수가 실행되어야 한다는 것을 알려주는 것입니다.

하지만 코드에서는 이펙트 내에서 socket 객체가 사용됩니다. 이로 인해 handleMessage 함수와 정리 함수( socket.off('message') )가 암묵적으로 socket 의 현재 값에 의존하는 클로저가 생성됩니다. socket 변경되는 경우(예: 재연결 또는 재초기화) 이펙트는 오래된 socket 인스턴스를 사용하게 됩니다.

일반적인 문제

  • 오래된 폐쇄: 이벤트 핸들러( handleMessage )가 오래된 socket 객체와 함께 작동하고 있을 수 있습니다.

  • 잘못된 정리: socket.off('message') 의도한 이벤트 리스너를 제거하지 못할 수 있습니다.

  • 메모리 누수: 정리에 실패하면 메모리 누수 및 예기치 않은 동작이 발생할 수 있습니다.

솔루션

1. 안정적인 참조를 위해 useRef 사용

import React, { useEffect, useRef } from 'react';

function MyComponent({ socket }) {
  const socketRef = useRef(socket);

  useEffect(() => {
    const currentSocket = socketRef.current;
    currentSocket.on('message', handleMessage);
    return () => {
      currentSocket.off('message');
    };
  }, []); // Empty dependency array is now safe
}

이것이 효과적인 이유:

  • useRef 렌더링 간에 지속되는 변경 가능한 객체를 생성합니다.

  • 참조 객체 자체는 변경되지 않으므로 효과가 다시 실행되지 않습니다.

  • ref를 통해 최신 소켓 값에 접근할 수 있습니다.

2. 핸들러에 useCallback 사용

import React, { useEffect, useRef, useCallback } from 'react';

function MyComponent({ socket, someProp }) {
  const socketRef = useRef(socket);

  const handleMessage = useCallback((message) => {
    // Do something with the message and potentially someProp
    console.log(message, someProp);
  }, [someProp]); // Include dependencies of handleMessage

  useEffect(() => {
    const currentSocket = socketRef.current;
    currentSocket.on('message', handleMessage);
    return () => {
      currentSocket.off('message', handleMessage);
    };
  }, [handleMessage]); // Depend on the memoized handler
}

3. useEffect 내부에서 소켓 수명 주기 관리

import React, { useEffect, useState } from 'react';

function MyComponent() {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const socket = new WebSocket('your_websocket_url');

    const handleMessage = (message) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    };

    socket.on('message', handleMessage);

    return () => {
      socket.off('message', handleMessage);
      socket.close();
    };
  }, []); // Empty array is correct - socket lifecycle managed within
}

4. 커스텀 후크 솔루션

function useSocket(url) {
  const [messages, setMessages] = useState([]);
  const socketRef = useRef(null);

  useEffect(() => {
    const socket = new WebSocket(url);
    socketRef.current = socket;

    const handleMessage = (message) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    };

    socket.on('message', handleMessage);

    return () => {
      socket.off('message', handleMessage);
      socket.close();
    };
  }, [url]);

  const sendMessage = useCallback((message) => {
    if (socketRef.current?.readyState === WebSocket.OPEN) {
      socketRef.current.send(message);
    }
  }, []);

  return { messages, sendMessage };
}

모범 사례

  1. 종속성 관리

    • 안정적인 참조를 위해 useRef 사용하세요

    • useCallback 사용하여 핸들러 메모하기

    • 소켓 수명 주기 관리를 고려하세요

  2. 성능 최적화

    • 불필요한 재렌더링을 최소화하세요

    • 대용량 메시지를 효율적으로 처리하세요

    • 적절한 정리 패턴을 사용하세요

  3. 오류 처리

    • 연결 오류를 정상적으로 처리합니다

    • 필요한 경우 재연결 논리를 구현합니다.

    • 리소스를 적절하게 정리하세요

  4. 테스트 고려 사항

    • 테스트에서 모의 WebSocket 연결

    • 이벤트 리스너 정리 확인

    • 테스트 오류 시나리오

프로젝트 구조

src/
├── config.ts        # Configuration and API settings
├── fileUtils.ts     # File operations and language detection
├── index.ts         # Entry point
├── perplexity.ts   # Perplexity AI integration
├── server.ts       # MCP server implementation
├── stackOverflow.ts # Stack Overflow API integration
└── types.ts        # TypeScript interfaces

알려진 문제

현재 문제와 해결 방법은 errors.md에서 확인하세요.

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PoliTwit1984/second-opinion-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server