🦔

MCPサーバーのtool呼び出しをLLMにトリガーしてもらう

2025/01/10に公開

TypeScriptでMCPサーバーのtool呼び出しをするはMCPクライアントでサーバーの呼び出しをシンプルに実装しました。
次はこの呼び出しをLLMに自動化してもらうというステップに進んでみます。これができると任意のプログラムにMCPサーバーの機能をアタッチできます。
以下のコードでは、MCPサーバーの情報をクライアント経由でclaude-3-5-sonnetに渡し、MCPサーバーのToolsをどう呼び出すのか計画させて、その結果をさらにMCPクライアントでコールしてまたclaude-3-5-sonnetで会話を継続します、Obsidian内の記事を要約し、その内容を記憶させるシステムを実装しています。

ポイント

  • クライアントとサーバーは1対1です
  • tools/list エンドポイントを使って利用可能なツールの一覧を取得します
  • どのツールを呼び出すのか+その引数をLLMに生成してもらいます
  • その結果をtools/call エンドポイントを使って特定のツールを呼び出します
  • content.type === 'tool_use'が継続する限りツール呼び出しを続けます
  • content.type !== 'tool_use'になったらメッセージを出力します

実行結果

ノートを検索して記事を要約し、メモリーに記憶してもらいます。

❯ npx tsx tools.ts
Connected to server.
MCP Obsidian Server running on stdio
Allowed directories: [ '/tmp/obsidian' ]
Initialized.
Assist: MCPに関連するノートを検索してみましょう。
Tool Result: /articles/mcp-typescript-sdk.md
Tool Result: /articles/mcp-typescript-sdk.md:
---
title: TypeScriptでMCPサーバーのtool呼び出しをする
emoji: 💬
type: tech
topics:
  - mcp
  - typescript
  - llm
published: true
---
[**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/introduction) を使用してTypeScriptで特定の
Message: 記事の内容を以下のように要約して記憶しました:

タイトル: TypeScriptでMCPサーバーのtool呼び出しをする

主な内容:
1. Model Context Protocol (MCP)をTypeScriptで利用する方法の解説
2. MCPクライアントを使用して@modelcontextprotocol/server-memoryパッケージのサーバーを呼び出す実装例

主要コンポーネント:
- `Client`: MCPクライアント作成用
- `StdioClientTransport`: 標準入出力でMCPサーバーと通信
- `CallToolResultSchema`: ツール呼び出し結果の型定義

実装のステップ:
...
Closed.

メモリーに記憶していることを確認する

❯ jq . < ./node_modules/@modelcontextprotocol/server-memory/dist/memory.json | tail -n 30
    "Claude DesktopやZedなどのエディタ内部で透過的に実行される",
    "複数のMCPサーバーへの接続管理と呼び出しが可能",
    "TypeScript SDKを使用して実装可能"
  ]
}
{
  "type": "entity",
  "name": "TypeScript SDK",
  "entityType": "Software",
  "observations": [
    "MCPサーバーのツール呼び出しを実装するためのSDK",
    "Client、StdioClientTransport、C)allToolResultSchemaなどの主要コンポーネントを提供"
  ]
}
{
  "type": "entity",
  "name": "MCP Server",
  "entityType": "Software",
  "observations": [
    "@modelcontextprotocol/server-memoryパッケージとして提供",
    "知識グラフの操作用ツールを提供",
    "データはJSONファイルとして保存される"
  ]
}
{
  "type": "relation",
  "from": "MCP Client Implementation",
  "to": "MCP Server Memory",
  "relationType": "communicates with"
}

思い出してもらいましょう。
念の為obsidianサーバーへの接続はコメントアウトして、単に「ask('あなたのmemoryからMCPについて教えてください。');」と聞きます。

❯ npx tsx tools.ts
Connected to server.
Knowledge Graph MCP Server running on stdio
Initialized.
Assist: MCPについて知識グラフを検索してみましょう。
Tool Result: {
  "entities": [
    {
      "type": "entity",
      "name": "MCP TypeScript SDK",
      "entityType": "Technology",
      "observations": [
        "MCPサーバーのツールをTypeScriptから呼び出すためのSDK",
        "Client, StdioClientTransport, CallToolResultSchemaなどの主要コンポ
Message: MCPに関する情報を知識グラフから要約してお伝えします:

MCPは「Model Context Protocol」の略称で、主に以下のような特徴を持つプロトコルです:

1. 基本的な概要:
- サーバーとクライアント間でツール呼び出しを行うためのプロトコル
- Claude DesktopアプリやZedなどのエディタ内部で透過的に実行される
- 複数のMCPサーバーへの接続管理と呼び出しが可能

2. 主要コンポーネント:

サーバーサイド:
- @modelcontextprotocol/server-memoryパッケージとして提供
- JSONファイルをストレージとして使用
- create_entities、read_graphなどのツールを提供
- 知識グラフのデータを管理する

クライアントサイド:
- TypeScript SDKを通じて実装可能
- Client、StdioClientTransport、CallToolResultSchemaなどの主要コンポーネントを提供
- クライアントの初期化時に名前、バージョン、機能の設定が必要
- StdioClientTransportを使用して標準入出力でサーバーと通信

3. 実装方法:
- TypeScript SDKを使用して実装可能
- クライアントからサーバーへの通信は標準入出力(stdio)を通じて行われる
- クライアントは`client.request`メソッドでツール呼び出しを実行可能

これらのコンポーネントが連携して、知識グラフの操作や管理を可能にする統合的なプロトコルとして機能しています。
Closed.

メモリーから探索してくれました。

Discussion