MCPサーバ VSCodeの設定
はまりポイント:
settting.jsonには直接、mcpサーバを記述しない
mcp.jsonの専用ファイルに書く
構文は注意
一番親に"servers": {の記述が必要
-----
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
サーバを立ち上げて「クライアントからのリクエストを受け取り → ハンドラで処理 → レスポンスを返す」仕組みを提供する中心的なクラス。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
サーバとクライアントを 標準入出力 (stdin/stdout) 経由でつなぐトランスポート層。
------
SQLServer
mssql ライブラリは、内部的にはデフォルトで「Tedious」という純粋なJavaScriptドライバを使用しています。
外部から来るリクエストの種類ごとに、どう処理するか(どの関数を呼ぶか)を登録している
こうすることで、MCPサーバーが受け付けるリクエストに対して正しい処理が行われるようになる
LLMはtoolsからMCPサーバの情報を得る
pip
https://scrapbox.io/files/68c76d3ae260c689e63aa697.png
------
tsやnodeを使う上で
TypeScript で Node.js の API を型安全に使えるようにするための開発用ライブラリ
npm install --save-dev @types/node
コンパイル
npx tsc app.ts --outDir dist
https://scrapbox.io/files/68ca9ef91fbcc069674d3346.png
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return await handleListResources();
});
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
return await handleReadResource(request.params.uri);
});
server.setRequestHandler(ListToolsRequestSchema, async () => {
return handleListTools();
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
return await handleToolCall(
ここでMCPクライアントないしLLMに情報を連携している
const server = new McpServer({
name: "cat-image",
version: "1.0.0",
});
---------
いいところに気づきましたね。
McpServer の tool メソッドは 「LLMに公開するツールを定義する」ためのメソッド です。
引数は基本的に ツールのメタデータと実装関数 のセットになっています。
⸻
シグネチャ(概念的に)
server.tool(
name: string, // ツール名(LLMから呼ばれるときの識別子)
description: string, // そのツールの説明
schema: z.ZodType<any>, // 入力のバリデーションスキーマ
implementation: (args: z.infer<typeof schema>, ctx: ToolContext) => Promise<any> | any
)
⸻
各引数の意味
1. name: string
• ツールの名前。LLMから呼び出すときの識別子になる。
2. description: string
• そのツールが何をするのかを自然言語で説明。
• LLMがツールを使うかどうかを判断するヒントになる。
3. schema: z.ZodType
• ツールの入力(引数)の形式を定義する。
• zod を使って JSON Schema 的に書く。
• LLMはこの仕様を見て、正しい入力を組み立てる。
4. implementation: Function
• 実際に処理を行う関数。
• (args, ctx) で呼ばれる。
• args: LLMから渡された引数(schemaに従ってvalidate済み)
• ctx: 呼び出しコンテキスト(ログやメタ情報)
⸻
例
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const server = new McpServer({
name: "cat-image",
version: "1.0.0",
});
// ツール定義
server.tool(
"get-cat-image", // name
"ランダムな猫の画像URLを返す", // description
z.object({ breed: z.string().optional() }), // schema
async (args, ctx) => { // implementation
const breed = args.breed ?? "any";
// ここで外部APIを叩くなど
return { url: https://example.com/cat/${breed}.jpg };
}
);
⸻
LLMから見ると
• 「get-cat-image というツールがある」
• 「入力は { breed?: string }」
• 「出力は { url: string }」
と理解して、必要なときに使う。
⸻
👉 まとめると、
server.tool の引数は (名前, 説明, 入力スキーマ, 実装関数) です。
⸻
質問なんですが、実際に この cat-image サーバをVSCodeやChatGPTに登録して試す のも興味あります?