chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

APIでLLMを制御する、MCP Serverと処理を合流させる

課題:LLMをAPIで制御してMCP Serverと接続する。LLM Client(LLMアプリ)側で調整して、LLMとMCP Serverの処理を合流させたい

APIで呼び出せるLLM

  • Gemini / Google
    • Google CloudのVertex AI経由でAPI提供。Gemini 1.5 Proなどが利用可能
  • Claude / Anthropic
    • Claude 3系(Haiku, Sonnet, Opus)をAPIで利用可能。AWS Bedrock経由でも提供
  • ChatGPT / OpenAI
    • GPT-4oやGPT-3.5を OpenAI API で利用可能。Azure経由でも提供
  • Copilot / MS?
    • 直接提供なし、Copilot StudioやGraph API連携で拡張可能
  • LLaMA 2/3 / Meta
    • 直接呼び出せるAPIなし、BedrockやOpenRouter経由で利用
  • Bedrock / AWS
    • 複数のモデル(Anthropic Claude, Meta Llama, Cohere, Stability AIなど)を統合提供するプラットフォーム

Bedrockならboto3経由で呼び出せるので、初期導入がまだ楽(boto3は所用で使ってるし・・・)

Boto3を使ってBedrockのどれかのLLMを呼び出して使う際、所定の使い方をすれば文脈は維持されるらしい。よって、、PC上のLLM ClientをPythonで作り、boto3経由でBedrockのLLMに接続する、LLM Clientのinput 関数?等で入力を受け取り、Bedrockで生成させて、戻ってきた生成分をLLM Clientで解釈して、関数呼び出しと判断したら、MCP Serverを呼びだすと。呼び出して得られた結果を再度LLMに渡して、生成された文章を利用者に提示する。このような流れになるかと。

シーケンス図(風?)に表現すると以下

Bedrock上のAnthropicを使う場合、文脈を維持させる方法として、過去履歴付きで対話すればよいらしい
boto3を使ってBedrock上のAnthropic claude-sonnet-4を呼び出すサンプルコード

#!/usr/bin/python3

import boto3
from botocore.exceptions import ClientError

user_message = "Describe the purpose of a 'hello world' program in one line."
conversation = [
    {
        "role": "user",
        "content": [{"text": user_message}],
    }
]

client = boto3.client("bedrock-runtime", region_name="ap-northeast-1")
model_id = 'apac.anthropic.claude-sonnet-4-20250514-v1:0'

try:
    # Send the message to the model, using a basic inference configuration.
    response = client.converse(
        modelId=model_id,
        messages=conversation,
        inferenceConfig={"maxTokens": 512, "temperature": 0.5, "topP": 0.9},
    )
    # Extract and print the response text.
    response_text = response["output"]["message"]["content"][0]["text"]
    print(response_text)

except (ClientError, Exception) as e:
    print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}")
    exit(1)

上記を実行すると以下と回答が得られる

A 'hello world' program serves as the simplest possible introduction to a programming language, 
demonstrating basic syntax and verifying that the development environment is working correctly.

MCP Serverの存在をあらかじめ伝えてから対話を開始したい。どうやって伝えるか? 仕様書を送りつけてから会話する方法もあるが、Gitに公開しているソースを直接読んでもらえれば話は早い。だが、、どうもURLを伝えるだけではソースを読み込んでくれないようであった。
以下のように、対話の冒頭に知っておいてほしい前提知識は伝えてから会話に入る必要があるらしい。毎回これをやっていると送付するトークン量が増えて利用料が上がってしょうがないと思うのだが・・

messages = [
    {"role": "system", "content": "あなたはMCP Serverの命令文を生成するAIです。"},
    {"role": "user", "content": "ライン2の搬送速度を10に設定して"},
    {"role": "assistant", "content": "setConveyorSpeed(line=2, speed=10.0)"},
]

というわけで、、、MCP Serverの調査も必要なのだが、、某学校様向け研修教材もそろえていかないといけないので、、この件は今日はここまでとする。