MCP 및 Python MCP 서버 개발 설명

AI 실습 튜토리얼6개월 전 업데이트 Sharenet.ai
1.6K 0
吐司AI

MCP에 대해 처음 알아보기

MCP(모델 컨텍스트 프로토콜)는 애플리케이션이 대규모 모델에 컨텍스트를 제공하는 방식을 표준화하기 위해 개발된 프로토콜로, MCP를 사용하면 LLM을 위한 데이터, 도구를 제공하는 표준 방식을 제공하여 에이전트 또는 LLM 기반의 복잡한 워크플로우를 더 쉽게 구축할 수 있습니다.

 

빌드

MCP는 MCP 호스트 애플리케이션이 여러 MCP 서버를 연결할 수 있는 CS 구조입니다. MCP 和 Python MCP Server 开发详解

  • MCP 호스트: MCP를 통해 데이터를 가져와야 하는 프로그램(예: Claude Desktop, IDE 또는 일부 AI 도구 등)입니다.
  • MCP 클라이언트: MCP 프로토콜 클라이언트, MCP 서버는 일대일 지원입니다.
  • MCP 서버: MCP를 통해 일부 특수 기능을 노출해야 하는 라이트 애플리케이션입니다. MCP 프로토콜 정의에 따르면 서버는 리소스, 도구, 프롬프트의 세 가지 표준 기능을 제공할 수 있으며, 각 서버는 세 가지 기능을 동시에 제공하거나 그 중 한 가지 기능을 제공할 수 있습니다.
    • 리소스: 리소스는 파일 데이터 읽기와 유사하게 파일 리소스 또는 API 응답으로 반환되는 콘텐츠일 수 있습니다.
    • 도구: 도구, 타사 서비스, 함수 함수를 통해 LLM에서 호출할 수 있는 함수를 제어할 수 있습니다.
    • 프롬프트: 사용자가 특정 작업을 완료할 수 있도록 미리 정의된 템플릿인 프롬프트입니다.
  • 로컬 데이터 리소스: MCP 서버가 안전하게 액세스할 수 있는 로컬 파일, 데이터베이스, 서비스 등입니다.
  • 원격 서비스: MCP 서버가 네트워크를 통해 연결할 수 있는 외부 시스템(예: API)입니다.

 

MCP의 서비스 개략도: MCP 和 Python MCP Server 开发详解

MCP 서버는 MCP 프로토콜을 통해 호스트 애플리케이션에 일부 기능 목록을 제공하고(예: 도구 목록 제공), 호스트 애플리케이션은 이 목록을 LLM이 읽고 이해할 수 있는 형식으로 형식화합니다. 호스트 애플리케이션은 이 기능 목록을 사용하여 빅 모델에서 처리해야 하는 일부 요청(프롬프트)을 LLM에 보낼 수 있으며, LLM은 이 프롬프트에 따라 tool_calls의 json 문자열을 반환합니다. 호스트 애플리케이션이 이 tool_calls를 받으면 해당 MCP 서버 도구를 호출하여 해당 결과를 반환합니다.

 

클로드 데스크톱에서 MCP 사용

Claude 데스크톱 클라이언트를 사용하려면 반드시 먼저 설치해야 하며, 이 설치는 생략됩니다. 파일 시스템 MCP 서버를 구성합니다. MCP 和 Python MCP Server 开发详解

그런 다음 개발자 아래에서 구성 편집을 선택합니다, MCP 和 Python MCP Server 开发详解

쇼(티켓)claude_desktop_config.json파일 시스템에 대한 MCP 서버 구성을 완료하려면 사용자 아이디를 내 컴퓨터 사용자 아이디로 바꿔야 합니다. (구성 사용자 아이디를 내 컴퓨터의 사용자 아이디로 바꾸고 node.js 환경도 로컬로 설치해야 합니다.)

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Desktop",
        "/Users/username/Downloads"
      ]
    }
  }
}

구성이 완료되면 클루아드 클라이언트를 재시작합니다. 사용해 볼 준비가 완료됩니다.

MCP 和 Python MCP Server 开发详解

망치 아이콘을 클릭하면 MCP 서버에서 제공하는 도구를 볼 수 있습니다.

MCP 和 Python MCP Server 开发详解

다음 프롬프트를 입력하여 사용해 볼 수 있습니다.

Can you take all the images on my desktop and move them to a new folder called “Images”?

LLM의 피드백 및 파일 시스템 MCP 서버가 실행될 때 몇 가지 권한에 대한 알림이 더 있으므로 허용해야 합니다.

MCP 和 Python MCP Server 开发详解

그러면 LLM, MCPServer가 작동하기 시작하는 것을 볼 수 있습니다.

MCP 和 Python MCP Server 开发详解

 

MCP 서버 개발을 위한 시작하기 튜토리얼(파이썬 및 pip)

파이썬 기술 스택을 사용하는 간단한 MCP 서버

 

설치가 필요합니다.

MCP 서버에는 python-sdk가 필요하고, 파이썬은 3.10이 필요하며, 다음을 설치합니다.

pip install mcp

 

추신 : MCP는 공식적으로 uv 패키지 관리 도구를 사용하고, 저는 보통 pip를 더 많이 사용하므로 텍스트는 주로 pip입니다. mcp 패키지 버전의 종속성 중 일부는 최신 버전이 아니기 때문에 깨끗한 환경을 확보하는 것이 가장 좋습니다. MCP 서버를 개발하려면 디버깅 클라이언트가 필요한데, MCP 인스펙터는 이 기능을 제공합니다.

npx @modelcontextprotocol/inspector <command> <arg1> <arg2>

Where 명령은 파이썬으로 작성된 Server를 사용하는 경우 파이썬으로 작성해야 합니다.<arg1> <arg2>는 선택적 매개변수입니다. 시작 후

 

데모 MCP 서버 개발

MCP 서버: MCP를 통해 일부 특수 기능을 노출해야 하는 라이트 애플리케이션입니다. MCP 프로토콜 정의에 따르면 서버는 리소스, 도구, 프롬프트의 세 가지 표준 기능을 제공할 수 있으며, 각 서버는 세 가지 기능을 동시에 제공하거나 그 중 한 가지 기능을 제공할 수 있습니다.

  • 리소스: 리소스는 파일 데이터 읽기와 유사하게 파일 리소스 또는 API 응답으로 반환되는 콘텐츠일 수 있습니다.
  • 도구: 도구, 타사 서비스, 함수 함수를 통해 LLM에서 호출할 수 있는 함수를 제어할 수 있습니다.
  • 프롬프트: 사용자가 특정 작업을 완료할 수 있도록 미리 정의된 템플릿인 프롬프트입니다.

다음은 python-sdk를 사용하여 세 가지 유형의 기능에 대한 데모입니다.

 

프롬프트

프롬프트부터 시작하여 다음과 같이 진행하겠습니다.handle_list_promopts사용 가능한 단서 단어 템플릿 목록입니다.handle_get_prompt는 이름을 기반으로 특정 프롬프트 템플릿을 가져오는 것입니다.

@server.list_prompts()
async def handle_list_prompts() -> list[types.Prompt]:
    """
    提示模版定义
    """
    return [
        types.Prompt(
            name="example-prompt",
            description="An example prompt template",
            arguments=[
                types.PromptArgument(
                    name="arg1",
                    description="Example argument",
                    required=True
                )
            ]
        )
    ]

@server.get_prompt()
async def handle_get_prompt(
    name: str,
    arguments: dict[str, str] | None
) -> types.GetPromptResult:
    """
    提示模板处理
    """
    if name != "example-prompt":
        raise ValueError(f"Unknown prompt: {name}")

    return types.GetPromptResult(
        description="Example prompt",
        messages=[
            types.PromptMessage(
                role="user",
                content=types.TextContent(
                    type="text",
                    text="Example prompt text"
                )
            )
        ]
    )

 

리소스

리소스 관리 기능용 코드list_resources사용 가능한 리소스를 나열하여 리소스 목록을 반환합니다.read_resource샘플 리소스는 테스트용으로 제작된 데모입니다.

@server.list_resources()
async def list_resources() -> list[types.Resource]:
    """
    资源定义
    """
    test='test'
    return [
        types.Resource(
            uri=AnyUrl(f"file:///{test}.txt"),
            name=test,
            description=f"A sample text resource named {test}",
            mimeType="text/plain",
        )
        # for name in SAMPLE_RESOURCES.keys()
    ]
SAMPLE_RESOURCES={'test':'this demo is a mcp server!'}
@server.read_resource()
async def read_resource(uri: AnyUrl) -> str | bytes:
    assert uri.path is not None
    print(uri.path)
    name = uri.path.replace(".txt", "").lstrip("/")
    # print(name)
    if name not in SAMPLE_RESOURCES:
        raise ValueError(f"Unknown resource: {uri}")

    return SAMPLE_RESOURCES[name]

 

도구

工具定义和调用,handle_list_tools定义可用的工具,使用 JSON Schema 验证工具参数。handle_call_tool处理工具调用,根据工具名称和参数执行相应的操作。 @server.list_tools() async def handle_list_tools() -> list[types.Tool]:     """     工具定义.     每个工具都使用JSON Schema验证指定其参数.     """     return [         types.Tool(             name="demo-tool",             description="Get data tool for a param",             inputSchema={                 "type": "object",                 "properties": {                     "param": {                         "type": "string",                         "description": "url",                     },                 },                 "required": ["param"],             },         )     ] @server.call_tool() async def handle_call_tool(     name: str, arguments: dict | None ) -> list[Any]:     logging.info(name)     """     处理工具调用     """     if not arguments:         raise ValueError("Missing arguments")     if name == "demo-tool":         param = arguments.get("param")         if not param:             raise ValueError("Missing state parameter")         param = param.upper()         return [             types.TextContent(                 type="text",                 text=f"text:{param}"             )         ]     else:         raise ValueError(f"Unknown tool: {name}")

 

검사자

MCP 서버는 다음과 같이 작성되었으며 디버깅을 위해 MCP 검사기를 시작할 수 있으며 서버 코드가 있는 디렉터리에서 다음을 입력합니다.

npx @modelcontextprotocal/inspector

시작 후 그림에 따라 다음 스크린 샷을 가져 와서 http://localhost:5273, 앞서 말한대로 전송 유형은 STDIO를 선택하고 명령은 python을 입력하고 인수는 server.py를 입력하고 (위의 데모 코드는 server.py 파일에 저장됨) 연결을 클릭합니다. 다이어그램에서 각 유형별로 해당 서버 서비스 호출을 입력하고 리소스에서 리소스 나열을 클릭하면 모든 리소스가 나열되고 해당 리소스를 클릭하면 특정 리소스의 내용을 확인할 수 있습니다.

이를 통해 당사가 개발한 MCP 서버와 상호 작용할 수 있습니다.

 

Claude 데스크톱으로 구성하는 방법

방금 인스펙터에서 수행한 명령 구성에 따라 이 MCP 서버를 Claude에 구성합니다. Claude 데스크톱의 설정을 클릭하고 개발자 탭을 선택한 다음 구성 편집을 클릭하여 claude_desktop_config.json으로 이동합니다.

현재 파일 정리용과 플레이라이트를 위한 MCP 서버 두 대를 다음과 같은 구성으로 설치했습니다(npx를 통해 플레이라이트를 위한 MCP 서버를 설치하기 위해).

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/crisschan/Desktop",
        "/Users/crisschan/Downloads"
      ]
    },
     "playwright": {
      "command": "npx",
      "args": ["-y", 
      "@executeautomation/playwright-mcp-server"]
    }
  }
}

이 형식으로 자체 데모 서비스를 구성한 다음 Claude 데스크톱을 저장하고 다시 시작하세요.

{
  "mcpServers": {
    ,
    "demo": {
      "command": "/opt/anaconda3/bin/python3",
      "args": ["/Users/workspace/pyspace/try_mcp/server.py"]
      }
  }
}

구성에서 명령은 해당 파이썬 버전의 절대 주소여야 하며, 절대 주소를 사용하려면 인수에 있는 server.py 코드의 위치도 마찬가지입니다.

© 저작권 정책
AiPPT

관련 문서

댓글 없음

없음
댓글 없음...