mcp-server-authoring
Claude Desktop、Claude Code、Cursor、Claude Agent SDKなどのAIクライアントに対して、ツール、リソース、プロンプトを提供する本番レベルのMCP(Model Context Protocol)サーバーを構築できます。 ユーザーがMCPサーバーを構築したい、内部ツールをAIエージェントに公開したい、APIをエージェント向けにラップしたい、または再利用可能なMCPサーバーをレジストリに公開したい場合に、このスキルを活用してください。 以下のキーワードで自動的に有効化されます:MCPサーバー、Model Context Protocol、Claudeへのツール公開、@modelcontextprotocol/sdk、mcp.json、stdioサーバー、HTTP MCPサーバー。
description の原文を見る
Build production-quality MCP (Model Context Protocol) servers that expose tools, resources, and prompts to AI clients like Claude Desktop, Claude Code, Cursor, and the Claude Agent SDK. Use this skill when the user wants to build an MCP server, expose internal tooling to an AI agent, wrap an API for agents, or publish a reusable MCP server to a registry. Activate when: MCP server, Model Context Protocol, expose tools to Claude, @modelcontextprotocol/sdk, mcp.json, stdio server, HTTP MCP server.
SKILL.md 本文
MCPサーバーオーサリング
TypeScriptまたはPythonでMCPサーバーをビルドし、任意のMCP互換クライアントで利用できるようにします。
いつ使うか
- Claude Desktop / Claude Code / Cursorに内部APIまたはツールを公開したい
- 共有可能なMCPサーバーをビルドしている(npm、PyPI、またはSmitheryレジストリ)
- 読み取り専用のデータソースをMCPリソースとしてラップする必要がある
- エージェントがクライアントごとのカスタムグルーコードなしであなたのサービスを呼び出す必要がある
コアモデル
MCPサーバーは3つのプリミティブを公開します:
| プリミティブ | 目的 | 副作用 |
|---|---|---|
| Tool | エージェントが呼び出すアクション | 副作用がある可能性(書き込み、ネットワーク呼び出し) |
| Resource | エージェントが読む取得するデータ | 読み取り専用、URIでアドレス指定 |
| Prompt | 再利用可能なプロンプトテンプレート | 副作用なし、ユーザー呼び出し可能 |
正しいプリミティブを選択してください — 読み取り操作をツールとして公開するとリソースとするべき時にコンテキストを無駄にします。
クイックスタート — TypeScript (stdio)
npm init -y
npm i @modelcontextprotocol/sdk zod
npm i -D typescript tsx @types/node
// src/server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "weather-server",
version: "1.0.0",
});
server.tool(
"get_forecast",
"Get a weather forecast for a location",
{
location: z.string().describe("City name or lat,lng"),
days: z.number().int().min(1).max(14).default(3),
},
async ({ location, days }) => {
const data = await fetchForecast(location, days);
return {
content: [{ type: "text", text: JSON.stringify(data) }],
};
},
);
server.resource(
"station",
"weather://stations/{id}",
async (uri) => {
const id = uri.pathname.split("/").pop()!;
const station = await fetchStation(id);
return {
contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(station) }],
};
},
);
const transport = new StdioServerTransport();
await server.connect(transport);
実行してクライアントのmcp.jsonに登録します:
{
"mcpServers": {
"weather": {
"command": "npx",
"args": ["-y", "tsx", "src/server.ts"]
}
}
}
クイックスタート — Python (stdio)
uv add "mcp[cli]"
# server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather-server")
@mcp.tool()
async def get_forecast(location: str, days: int = 3) -> dict:
"""Get a weather forecast for a location."""
return await fetch_forecast(location, days)
@mcp.resource("weather://stations/{id}")
async def station(id: str) -> dict:
return await fetch_station(id)
if __name__ == "__main__":
mcp.run()
ツールコントラクトルール
- 名前: snake_case、動詞主導(
search_issuesでIssueSearcherではなく) - 説明: 1文、動詞で始まる、主要な引数に言及
- スキーマ: Zod / Pydanticを使用し、すべてのフィールドで記述的な
.describe()を使用 - 戻り値の形状: 常に
{ content: [{ type: "text", text: ... }] }— JSONをテキストとしてラップ - エラー: スロー — SDKが
isError: trueに変換します。メッセージに修復方法を含める - べき等性: 書き込みツールは可能な限り
idempotency_keyを受け付けるべき
プログレッシブディスクロージャーパターン
40個のツールをクライアントにダンプしないでください。小さく安定したサーフェスを公開し、ツールにフォローアップハンドルを返させます:
server.tool("list_projects", "List accessible projects", {}, async () => {
const projects = await api.listProjects();
return {
content: [{
type: "text",
text: `Found ${projects.length} projects. Use get_project with id to read one:\n` +
projects.map(p => `- ${p.id}: ${p.name}`).join("\n"),
}],
};
});
テスト
開発中はMCP Inspectorを使用します:
npx @modelcontextprotocol/inspector tsx src/server.ts
すべてのツールを呼び出し、すべてのリソースを検査し、プロンプトをリプレイするUIが提供されます。モックバックエンドに対してCIで実行してスキーマリグレッションを検出します。
公開
- npm: サーバーを
binエントリとして公開すると、ユーザーはnpx your-mcp-serverを実行できます - Smitheryレジストリ: ワンクリックインストールのために設定スキーマ付きの
smithery.yamlを追加 - プライベート: Dockerイメージとして配布し、
commandをdocker runにポイント
ベストプラクティス
- ツールサーフェスを≤15ツールに保つ — より多いとモデル選択精度が低下
- バイナリではなくテキストを返す — 大きなペイロードの場合はURIを使用したリソースを使用
server.sendNotificationプログレスイベント経由で長時間実行ツールをストリーム- 破壊的変更を行う場合はサーバーの
nameサフィックスをバージョン管理(github-v2) - ツール呼び出し時に環境変数からシークレットを読み込まない — 起動時に読み込んで高速失敗
- すべてのツール呼び出しをサーバー側でログ — エージェントの動作は予測不可能で、監査証跡が必要になります
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- latestaiagents
- ライセンス
- MIT
- 最終更新
- 2026/4/15
Source: https://github.com/latestaiagents/agent-skills / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。