Node 22.18 以降(TypeScript ファイルを直接実行できます)、Bun、または Deno が必要です。
プロジェクトを作成する#
npx picomcp init my-server
cd my-server
npm installすぐに動かせるサーバーが作成されます:
| ファイル | 役割 |
|---|---|
server.ts | サーバーの定義:ツール、リソース、プロンプト |
main.ts | stdio でサーバーを起動する |
server.test.ts | ツールをプロセス内で呼び出すテスト |
ゼロから始めたい場合は、2 つのパッケージをインストールして server.ts を自分で書きます:
npm install picomcp zodツールを書く#
server.ts を開きます:
import { pico } from "picomcp";
import { z } from "zod";
export const server = pico({ name: "my-server", version: "0.1.0" })
.tool("greet", {
description: "Greets someone by name.",
input: z.object({ name: z.string().describe("Who to greet") }),
run: ({ name }) => `Hello, ${name}!`,
});descriptionは、モデルがいつツールを呼び出すかを判断するために読むものです。モデルに向けて書いてください。inputには任意の Standard Schema を渡せます。runの中でnameはstring型になります。- ここでは
runは文字列を返しています。オブジェクトやコンテンツブロックを返すことも、エラーを投げることもできます。詳しくはツールを参照してください。
テストする#
import assert from "node:assert/strict";
import { test } from "node:test";
import { server } from "./server.ts";
test("greet says hello", async () => {
const result = await server.call("greet", { name: "Ada" });
assert.deepEqual(result.content, [{ type: "text", text: "Hello, Ada!" }]);
});npm testserver.call は型チェックされます。ツール名のタイプミスや引数の不足はコンパイルエラーになります。
接続する#
Claude Code の場合:
claude mcp add my-server -- node /absolute/path/to/my-server/main.tsあとは Claude に誰かへの挨拶を頼んでみてください。Claude Desktop、Cursor、VS Code などについてはクライアントを接続するを参照してください。
中身を調べる#
MCP Inspector を使うと、ツールを手動で呼び出して生のメッセージを確認できます:
npx @modelcontextprotocol/inspector node main.ts