0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自作 MCP Server Hands-On Part1: Hello World編

Last updated at Posted at 2025-09-15

1. Hello World

  • Claude Desktopを用いたMCP Server Hands-onです
  • この回ではMCPのHello Worldコードを作成します

1. claude_desktop_config.json の作成

PATHは個人の環境に合わせて変更してください。ポイントとしては、

  • command: venvで作成したpythonの指定
  • args: 以下で作成する hello_mcp_server.py の絶対PATH
claude_desktop_config.json
{
  "mcpServers": {
    "hello-mcp-server": {
      "command": "/<your workdir>/venv/bin/python",
      "args": [
        "/<your workdir>/src/hello_mcp_server.py"
      ]
    }
  }
}

2. hello_mcp_server.pyの作成

workdirに移動し、Pythonスクリプト hello_mcp_server.py を作成します。このスクリプトをHello World MCP Server として起動させます。

cd <your workdir>
vim hello_mcp_server.py
hello_mcp_server.py
#!/usr/bin/env python3
"""
最もシンプルなMCPサーバー - Hello World (FastMCP版)
挨拶機能を提供するMCPサーバー
"""

from fastmcp import FastMCP

# MCPサーバーインスタンスの作成
mcp = FastMCP("hello-mcp-server")


@mcp.tool()
def greet_person(name: str) -> str:
    """指定された名前で丁寧に挨拶します"""
    return f"こんにちは、{name}さん!\nHello World MCPサーバーへようこそ!"


if __name__ == "__main__":
    mcp.run()

3. テストプロンプトの実行

田中さんに挨拶してください

image.png

2. Hello World 改善版

2.1 MCPサーバはどのように選択される?

複数登録されたツールから、どのように適切なMCPサーバが選択されるのか?を理解して、先程のコードを改善してみます。

2.1 LLMがMCPサーバを選択し回答するまでの流れ

  • Claude Desktop が起動時に接続中の MCP サーバーへ handshake → tools/list を行い、ツール名・説明・JSON スキーマを把握
  • ユーザープロンプトを読んだモデルが「このツールを呼べば解決が速い」と判断すると、tools/call を発行(必要なら承認 UI)
  • 応答(戻り値)を受け取り、最終回答に自動で統合して返す

2.2. どうすれば hello-mcp-server が選ばれやすくなる?

  • 関数名・docstring を具体的に
    • greet_person/「指定された名前で丁寧に挨拶します」のように、以下を入れるとマッチ率が上がります
      • 目的語(挨拶・名前)
      • 期待結果(文章で返す)
  • 引数スキーマを明確に
    • 型ヒント・必須引数を適切に。モデルが自動で引数を埋めやすくなります
  • トリガー語を含める:
    • docstring に “greet / 挨拶 / hello / welcome” のような関連語を入れておくと、意味検索で拾われやすい

2.3. Hello World 改善版

#!/usr/bin/env python3
"""
Hello Greeting MCP Server
ユーザーに対して挨拶メッセージを返すシンプルなサーバー。
「挨拶して」「greet」「hello」などの入力に対応します。
"""

from fastmcp import FastMCP
from typing import Literal

mcp = FastMCP("hello-mcp-server")


@mcp.tool()
def greet_person(
    name: str,
    lang: Literal["ja", "en"] = "ja"
) -> str:
    """
    名前を指定すると、その人に挨拶を返します。
    - ユーザーが「挨拶」「hello」「greet」などと入力した場合に利用されます。
    - lang="ja" で日本語、lang="en" で英語の挨拶を返します。
    """
    if lang == "en":
        return f"Hello, {name}! Welcome to the Hello World MCP server!"
    return f"こんにちは、{name}さん!\nHello World MCPサーバーへようこそ!"


if __name__ == "__main__":
    mcp.run()

2.4. テスト

Please greet to Tanaka-san

image.png

Appendix

FastMCP以外にどのようなライブラリがある?

1. 公式 Python SDK (mcp)

  • Anthropic が公開している 公式の Python 用ライブラリ

  • リポジトリ: github.com/modelcontextprotocol/python-sdk

  • 特徴:

    • MCP プロトコルを一から扱える(低レベル API)
    • Tool, Resource, Server などを手動で定義する
    • 柔軟だが、コード量はやや多い

2. FastMCP

  • ユーザーが最初に貼ってくれたライブラリ。

  • リポジトリ: github.com/jlowin/fastmcp

  • 特徴:

    • デコレータベースで 関数を簡単にツール登録できる
    • 型ヒントから 自動的に JSON Schema を生成
    • 最小限のコードで MCP サーバーを立てたい場合に最適

3. TypeScript/JavaScript SDK

  • Anthropic 公式が提供する TypeScript 向け SDK

  • リポジトリ: github.com/modelcontextprotocol/typescript-sdk

  • 特徴:

    • Node.js / Bun / Deno など JS ランタイムで MCP サーバーが書ける
    • MCP のリファレンス実装に近い
    • Web 系開発者向き

4. コミュニティ製ライブラリ

(まだ発展途上ですが、徐々に増えています)

  • LangChain MCP インテグレーション

    • LangChain のツールを MCP サーバーとして公開できる仕組みが実験的に進んでいます。
  • Litellm MCP Wrapper

    • LLM プロバイダに簡単にアクセスできる MCP ツールサーバー
  • カスタム実装(直書き)

    • JSON-RPC over stdio を直接扱って MCP サーバーを書くことも可能。
    • 公式の プロトコル仕様 に従えばライブラリ不要

5. どれを使うべき?

Claude Desktop から使うだけなら FastMCP公式 SDK が現状ベスト

  • 素早く試したい: FastMCP
  • 柔軟に拡張したい / 本番運用: 公式 Python SDK (mcp)
  • Node.js や Web 環境と統合したい: TypeScript SDK
  • 自分で制御したい / 学習目的: JSON-RPC を直書き

Claude Desktop以外ではどのように統合するの?

以下のQiitaでvscodeにContinueの拡張機能インストールし、Hello Worldを実行する方法を記載しています

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?