AIパーソナル・ラーニング
と実践的なガイダンス
サイバーナイフ用ドローイングミラー

MCPとPython MCPサーバー開発の解説

MCPを初めて知る

MCP(モデルコンテキストプロトコル)は、アプリケーションが大規模なモデルのコンテキストを提供する方法を標準化するために開発されたプロトコルです。MCPは、LLMのためのデータやツールを提供する標準的な方法を提供し、MCPを使用することで、LLMに基づくエージェントや複雑なワークフローの構築が容易になります。

 

ビルド

MCPは、MCPホストアプリケーションが複数のMCPサーバをリンクできるCS構造である。

  • エムシーピー ホスト:クロードデスクトップ、IDE、一部のAIツールなど、MCPを通じてデータを取得する必要があるプログラム。
  • MCPクライアント:MCPプロトコルクライアント。
  • MCPサーバ:MCPを通じて特別な機能を公開する必要のあるライトアプリケーション。MCPプロトコルの定義によると、サーバーは3種類の標準機能(リソース、ツール、プロンプト)を提供することができ、各サーバーは3種類の機能を同時に提供することも、1種類の機能を提供することもできます。
    • リソース:リソースは、ファイルデータの読み取りと同様に、ファイルリソースまたはAPIレスポンスによって返されるコンテンツであることができます。
    • ツール:ツール、サードパーティ・サービス、ファンクション・ファンクション。
    • プロンプト:プロンプトは、ユーザーが特定のタスクを完了するための事前定義されたテンプレートです。
  • ローカルデータリソース:MCPサーバーが安全にアクセスできるローカルファイル、 データベース、サービスなど。
  • リモート・サービス:MCPサーバーがネットワーク経由で接続できる外部システム(APIなど)。

 


MCPのサービス概略図:

MCPサーバーは、MCPプロトコルを介してホスト・アプリケーションに機能のリ ストを提供し(例えば、ツールのリストを提供する)、ホスト・アプリケーション はこのリストをLLMが読み込んで理解できる形式にフォーマットします。 ホストアプリケーションは、この機能リストを使用して、ビッグモデルで処理する必要があるいくつかのリクエストをLLMに送信することができます(これがプロンプトです)。LLM はこのプロンプトに基づいて、ツール・コールの json 文字列を返します。Host Applicaiton がこのツール・コールを受信すると、対応する MCP サーバー・ツールを呼び出して、対応する結果を返します。

 

クロードデスクトップでMCPを使う

クロード・デスクトップ・クライアントの助けを借りて、まず間違いなくインストールする必要があり、このインストールは省略されます。ファイルシステムMCPサーバーを設定します。

次に「Developer」の下にある「Edit Config」を選択する、

見せるclaude_desktop_config.jsonファイル・システム用のMCPサーバーの設定を完了するには、ユーザー名を自分のコンピュータのユーザー名に置き換える必要があります。(コンフィギュレーション・ユーザー名を自分のコンピュータのユーザー名に置き換えるだけでなく、node.js環境をローカルにインストールする必要がある)

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

設定が完了したら、Cluadeクライアントを再起動します。これで試す準備が整います。

ハンマーアイコンをクリックすると、MCPサーバーが提供するツールが表示されます。

以下のプロンプトを入力して試してみてください。

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

LLMのフィードバックとファイルシステムMCPサーバーは、パーミッションについてもう少し注意を喚起しながら実行するので、許可することを忘れないでほしい。

すると、LLMとMCPServerが動き出すのがわかる。

 

MCPサーバー開発入門チュートリアル(pythonとpip)

pythonテクノロジースタックを使ったシンプルなmcpサーバー

 

インストールが必要

MCPサーバーにはpython-sdk、pythonには3.10が必要です。

pip install mcp

 

追記:MCPは公式にはuvパッケージ管理ツールを使用していますが、私は普段pipの方を使用しているので、本文は主にpipです。mcpの依存パッケージのバージョンが最新でないものもあるので、クリーンな環境を取得するのが一番です。 MCPサーバーの開発にはデバッグクライアントが必要ですが、MCP inspectorには以下のような機能があります。

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

pythonで書かれたサーバーを使用する場合は、pythonを使用します。<arg1> <arg2>はオプションのパラメータである。 起動後

 

デモMCPサーバーの開発

MCPサーバ:MCPを通じて特別な機能を公開する必要のあるライトアプリケーション。MCPプロトコルの定義によると、サーバーは3種類の標準機能(リソース、ツール、プロンプト)を提供することができ、各サーバーは3種類の機能を同時に提供することも、1種類の機能を提供することもできます。

  • リソース:リソースは、ファイルデータの読み取りと同様に、ファイルリソースまたはAPIレスポンスによって返されるコンテンツであることができます。
  • ツール:ツール、サードパーティ・サービス、ファンクション・ファンクション。
  • プロンプト:プロンプトは、ユーザーが特定のタスクを完了するための事前定義されたテンプレートです。

以下は、python-sdkを使った3種類の機能のデモです。

 

プロンプト

まずはプロンプトから。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_resourceSAMPLE_RESOURCESはテスト用に作られたデモです。

@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ファイルに保存されます)、接続をクリックします。図の中で、各タイプに対応するServerサービスコールを入力し、ResourcesのList Resourceをクリックすると、すべてのリソースが一覧表示され、対応するリソースをクリックすると、特定のリソースの内容が表示されます。

これによって、私たちが開発したMCPサーバーとやりとりすることができる。

 

クロードデスクトップへの設定方法

インスペクタで行ったコマンド設定に従って、この MCP サーバを Claude に設定します。Claudeデスクトップの設定をクリックし、開発者のタブを選択し、configの編集をクリックしてclaude_desktop_config.jsonにジャンプします。

現在、2台のMCPサーバーを以下の構成でインストールしています。1台はファイル整理用、もう1台はplaywright用です(playwrightのMCPサーバーをnpx経由でインストールするため)。

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

このフォーマットで独自のデモ・サービスを設定し、保存してクロード・デスクトップを再起動する。

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

コンフィギュレーションでは、コマンドは対応するバージョンのpythonの絶対アドレスでなければならず、argsの中のserver.pyのコードの位置も同様で、絶対アドレスを使用します。

無断転載を禁じます:チーフAIシェアリングサークル " MCPとPython MCPサーバー開発の解説
ja日本語