メインコンテンツまでスキップ

Software Design 202509

MCPで変わるLLMアプリ開発

MCPサーバはローカルMCPとリモートMCPがある。後者も少しずつ普及している。 MCPサーバとのMCPクライアント間の通信は、stdioでやる場合とStreamable HTTPでやる場合がある。

MCPホストとは、多くの場合、Claude DesktopのようなAIエージェントである。 MCPホストの中で、MCPサーバへの接続を行うのがMCPクライアント

サーバ側の機能には3つがある。

  • プロンプト - 事前定義されたテンプレート化された指示文
  • リソース - MCPサーバが提供する、読み取り専用のデータ
  • ツール - 本丸。外部からの情報取得や、他のシステムの操作などを行う

クライアント側の機能には以下の3つがあるが、普及はこれから。

  • ルート - アクセス可能なリソース範囲の定義
  • サンプリング - MCPホスト側のLLMを借用
  • エリシテーション - ユーザーから追加情報を引き出す

MCPホスト、つまりMCPサーバを利用する側のAIエージェントも、実は結構簡単に開発できる。 TSだとMastraが新進気鋭。 Pythonだと LangGraph や Strands Agents などがある。

文字コード

文字コードの基礎

  • 字種とは、音と意味の組み合わせ。
  • 字体とは、形のこと。
  • 字形とは、デザイン差のこと。

例えばなら、音と意味は同じで、形は違う。よって、字種は同じで、字体が異なる。 一方、字形が違うというのは、フォントによる差異などである。

異体字とは、字種が同じだが、正式な規範から外れた文字のこと。

符号化文字集合 とは、コンピューターで文字を扱うために、 あらかじめどの文字を扱うか決めた範囲のこと。

  • ISO/IEC 10646
    • Unicodeとほぼ互換だが、Unicodeは国際規格ではなくフォーラム規格である
    • 日本工業規格版が JIS X 0221
  • JIS X 0201 (1963年策定)
  • JIS X 0208:1983(JIS83)
  • JIS X 0213:2000(JIS2000)
  • JIS X 0213:2004(JIS2004)

文字符号化方式 は、具体的な符号化のやり方のこと。 ShiftJIS, EUC, UTF-8, UTF-16など。 UTF-16はアプリケーション内部で、UTF-8はネットワークを通じた交換(HTTP/JSON)などで主に使われる。

外字 とは、JIS X 0213やUnicodeに含まれていない、規格化されていない文字のこと。 システム間で共有できない、互換性のない文字と言える。

Unicode Ideographic Variation Database (IVD) は、 外字問題を標準的な仕組みで解決するために作成された、字形を管理するためのデータベース。 Unicode Ideographic Variation Selector (IVS) は、 Unicode IVDで管理されている字形を指定するための仕組み。 例えば「邉」はJIS X 0213では1つしか登録されていないが、IVD/IVSではたくさん登録されている。

データベースと文字コード

いまはUTF-8に統一されているので問題が起こることはあまりない。 しかし、MySQLだけは注意。utf8mb3やそのエイリアスであるutf8だと、 UTF-8の3バイト目までしか扱えず、一部の絵文字が化ける。utf8mb4をキッチリ指定すること。

並べ替えの規則をコレーションという。RDBの実装に依存する。

MySQLの場合は基本的にUnicodeの規定に従うが、設定の種類がたくさんある。 設定によっては文字の区別が大雑把で、同じ並び順になる文字が存在する。 これらはランダムに並び替わるので注意。

Postgresの場合は、デフォルトではOSのコレーション設定に依存する。

ドメイン解体新書 / Public Suffix List

eTLD(Effective Top-Level Domain) は、.comや.co.jpのように、 一般的に個人や組織が直接登録することができないドメインの部分を指す。

一方、eTLD+1 は「レジストラブルドメイン」と呼ばれる。 例えば、my-company.commy-company.co.jpなどがeTLD+1に該当する。

eTLD+1はセキュリティを扱うときの最小単位になる。 具体的には、ワイルドカードSSL証明書の利用が認められたり、ブラウザがSimeSiteを判定するときの単位となることができる。 eTLDに対してそれらが適用されることはない。

どの部分がeTLDなのかを判断するための基準が Public Suffix List (PSL) である。 PSLは、ドメインを客に払い出すサービスなどをしている場合に特に重要となる。

2025/9時点で15,000行強、300KB程度あるので、ブラウザにハードコードされたりキャッシュされたりしている。 以下のGitHubで管理されている。 https://github.com/publicsuffix/list

  • example.comと書くと、example.comがeTLDになる。
  • *.example.comと書くと、以下の全てがeTLDになる
    • test1.example.com
    • test2.example.com
    • ....(その他すべて)
  • !www.example.comと書くと、www.example.comだけをeTLDから除外する。 結果として何がeTLDになるかは他の行の設定に依存する。

つまみぐい関数型プログラミング / 高階関数

高階関数 / Higher-order function とは、関数を受け取ったり返したりする関数のこと。 関数がファーストクラスオブジェクトである(値と同じ用に扱える)場合に使える。 関数は値から値への変換を行う。その「値」に「関数」も含まれているということ。

関数を受け取る関数には、filter, map, reduceなどがある。 複雑な処理を複数の単純な関数に分けられるため、 入れ替えや変更の容易性、再利用性が高くなる。

関数を返す関数(カリー化+部分適用) を使うと、あらかじめ設定を焼き込んだ関数を生成できる。 主に Dependency Injection や、処理のバリエーションを簡素に表現するために使う。