mcp-server-creation について
mcp-server-creationは、MCPサーバーの設計とデプロイを支援するAgent Skillsのワークフローです。AIエージェントにツールやデータを提供する開発者向けに、プリミティブ、トランスポート、認証、Cloudflare Workersへのデプロイを扱います。
主な機能
- 01ツール、リソース、プロンプトの設計
- 02stdioとSSE/HTTPトランスポート
- 03トランスポート層の認証
- 04Cloudflare Workersへのデプロイ
- 05構造化された結果とエラー処理
活用シーン
- 01MCP経由で独自ツールを公開
- 02複数のMCPクライアント向け連携の構築
- 03Cloudflare Workersでエージェントツールをデプロイ
MCP 対応
互換クライアントにツール、リソース、プロンプトを公開するMCPサーバーの作成方法を扱います。ローカルのstdioとリモートのSSE/HTTPトランスポートに対応します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill mcp-server-creationインストール後、Claude Code で/mcp-server-creationを入力して読み込まれたか確認します。
詳細
MCP サーバーの作成
googleadsagent.ai™ による Agent Skills™ の一部です
説明
MCP サーバーの作成とは、標準化されたインターフェースを通じて AI エージェントにツール、リソース、機能を公開する Model Context Protocol サーバーを構築するスキルです。MCP は、AI エージェントのツールにおける汎用的な統合レイヤーとして登場しました。単一のプロトコルを使うことで、準拠するエージェント(Claude Code、Cursor、Codex など)は、カスタム統合コードを必要とせずにサーバー側のツールを検出して呼び出せます。Cloudflare Workers 上に本番品質の MCP サーバーを構築すると、インフラストラクチャを管理することなく、グローバルに低レイテンシでツールへアクセスできます。
このスキルは、googleadsagent.ai™ の Buddy™ エージェントを支える本番 MCP サーバーから得た知見に基づいています。このサーバーは workers/buddy-agent/ ディレクトリにあり、Cloudflare Workers にデプロイされています。MCP を通じて Google Ads 分析ツール、ナレッジベース検索、エンティティメモリ管理、ウェブ検索機能を公開し、あらゆる MCP 対応クライアントから利用できるようにしています。このアーキテクチャは、エッジで認証、レート制限、マルチテナント分離を処理します。
MCP の仕様では、3 つの中核的なプリミティブを定義しています。ツール(エージェントが呼び出せる実行可能な関数)、リソース(エージェントがアクセスできる読み取り専用データ)、プロンプト(再利用可能なプロンプトテンプレート)です。適切に設計された MCP サーバーは、明確なスキーマ、わかりやすい説明、堅牢なエラー処理を備えた、価値の高いツールに絞って公開します。トランスポート層は stdio(ローカル開発用)と SSE/HTTP(リモートデプロイ用)の両方をサポートし、トランスポート層で認証を統合します。
使用する場面
- 標準化されたプロトコルを通じて、カスタムツールを AI エージェントに公開する必要がある場合
- Claude Code、Cursor、その他の MCP クライアントで動作する統合を構築する場合
- グローバルなエッジアクセスを実現するため、エージェントのツールを Cloudflare Workers にデプロイする場合
- 組織内にツールマーケットプレイスや共有ツール基盤を構築する場合
- 独自仕様のツールインターフェースから、オープンな MCP 標準へ移行する場合
- エージェントが、サーバー側のシークレットや API アクセスを必要とするツールを使用する場合
仕組み
graph TD
A[AI Agent / MCP Client] -->|MCP Protocol| B[Transport Layer]
B -->|stdio| C[Local Development]
B -->|SSE/HTTP| D[Remote Server]
D --> E[Cloudflare Worker]
E --> F[Authentication]
F --> G[Tool Router]
G --> H[Tool: search_knowledge]
G --> I[Tool: analyze_campaign]
G --> J[Tool: get_metrics]
H --> K[Knowledge Base]
I --> L[Google Ads API]
J --> L
G --> M[Resource: config]
G --> N[Resource: schema]
MCP サーバーは、AI エージェントのクライアントと実際のデータソースや API の間に位置します。トランスポート層はプロトコルのネゴシエーションを処理します(ローカルでは stdio、リモートでは SSE/HTTP を使用)。Cloudflare Workers にデプロイする場合、受信リクエストは認証(OAuth、API キー、JWT)された後、適切なツールハンドラーにルーティングされます。各ツールハンドラーは、外部 API の呼び出し、データベースのクエリ、計算処理などのビジネスロジックを実装し、エージェントが推論に利用できる構造化された結果を返します。
実装
Cloudflare Workers 上の MCP サーバー:
import { McpAgent } from "agents/mcp";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
export class BuddyMCPServer extends McpAgent {
server = new McpServer({
name: "buddy-agent",
version: "1.0.0",
});
async init() {
this.server.tool(
"search_knowledge",
"Search the Google Ads knowledge base for patterns and best practices matching a query. Use BEFORE making recommendations.",
{ query: z.string(), category: z.enum(["bidding", "targeting", "creative", "budget", "general"]).optional(), maxResults: z.number().default(5) },
async ({ query, category, maxResults }) => {
const results = await this.searchKnowledgeBase(query, category, maxResults);
return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
}
);
this.server.tool(
"analyze_campaign",
"Analyze a Google Ads campaign's performance metrics and return structured insights with recommendations.",
{ campaignId: z.string(), dateRange: z.enum(["7d", "30d", "90d"]).default("30d"), metrics: z.array(z.string()).optional() },
async ({ campaignId, dateRange, metrics }) => {
const analysis = await this.analyzeCampaign(campaignId, dateRange, metrics);
return { content: [{ type: "text", text: JSON.stringify(analysis, null, 2) }] };
}
);
this.server.tool(
"store_entity",
"Persist an extracted entity (decision, metric, preference) to cross-session memory.",
{ userId: z.string(), entityType: z.enum(["decision", "metric", "preference", "fact"]), content: z.string(), importance: z.number().min(0).max(1).default(0.5) },
async ({ userId, entityType, content, importance }) => {
await this.persistEntity(userId, entityType, content, importance);
return { content: [{ type: "text", text: `Entity stored: [${entityType}] ${content}` }] };
}
);
}
private async searchKnowledgeBase(query: string, category?: string, limit?: number) {
const patterns = await this.env.KNOWLEDGE_KV.list({ prefix: category ? `pattern:${category}:` : "pattern:" });
const results = [];
for (const key of patterns.keys.slice(0, limit || 5)) {
const pattern = await this.env.KNOWLEDGE_KV.get(key.name, "json");
if (pattern && this.isRelevant(query, pattern)) {
results.push(pattern);
}
}
return results;
}
}
Wrangler の設定:
// wrangler.jsonc
{
"name": "buddy-mcp-server",
"main": "src/index.ts",
"compatibility_date": "2025-01-01",
"compatibility_flags": ["nodejs_compat"],
"kv_namespaces": [
{ "binding": "KNOWLEDGE_KV", "id": "your-kv-id" },
{ "binding": "MEMORY_KV", "id": "your-memory-kv-id" }
],
"vars": {
"ENVIRONMENT": "production"
},
"placement": { "mode": "smart" }
}
MCP クライアントの設定(Claude Code):
{
"mcpServers": {
"buddy-agent": {
"type": "sse",
"url": "https://buddy-mcp.googleadsagent.ai/sse",
"headers": {
"Authorization": "Bearer ${BUDDY_API_KEY}"
}
}
}
}
MCP クライアントの設定(Cursor):
{
"mcpServers": {
"buddy-agent": {
"url": "https://buddy-mcp.googleadsagent.ai/sse",
"headers": {
"Authorization": "Bearer ${BUDDY_API_KEY}"
}
}
}
}
stdio トランスポートを使ったローカル開発:
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const server = new McpServer({ name: "buddy-agent-dev", version: "1.0.0-dev" });
server.tool(
"search_knowledge",
"Search the local knowledge base for development and testing.",
{ query: z.string() },
async ({ query }) => {
const results = searchLocalKnowledge(query);
return { content: [{ type: "text", text: JSON.stringify(results) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
ベストプラクティス
- ツールをいつ使用するかが伝わる説明を書く — AI エージェントは説明に基づいてツールを選択します。「推奨を行う前に使用する」は、モデルが従える実用的な指針です。
- 説明的な列挙型を含む Zod スキーマを使用する — パラメーターの型を制約することで無効な入力を排除できます。特に列挙型は、モデルによるパラメーターの選択を効果的に導きます。
- 文章ではなく、構造化された JSON を返す — 構造化された結果はモデルが推論しやすく、説明文よりも使用するトークンが少なくなります。
- トランスポート層で認証を実装する — MCP サーバーを認証なしで公開しないでください。ツールへのルーティング前に検証される OAuth、JWT、または API キーを使用します。
- ツール数を絞る — 適切に設計された 5~10 個のツールは、重複する 50 個のツールよりも優れています。モデルは、選択肢が少なく明確な場合に、より適切に機能します。
- 複数の MCP クライアントでテストする — Claude Code、Cursor、その他のクライアントでは動作が異なる場合があります。対象となる各クライアントでツールの呼び出しをテストしてください。
- Cloudflare Workers を使用してエッジにデプロイする — エッジへのデプロイにより、地理的に分散したユーザーのレイテンシーを最小限に抑え、組み込みの DDoS 保護を利用できます。
- MCP サーバーをバージョン管理する — ツールの進化に合わせて、後方互換性を維持するか、既存のクライアント設定を破壊しないように明確にバージョンを上げてください。
プラットフォームの互換性
| 機能 | Claude Code | Cursor | Codex | Gemini CLI |
|---|---|---|---|---|
| MCP クライアントのサポート | ✅ ネイティブ | ✅ ネイティブ | ⚠️ 制限あり | ⚠️ 制限あり |
| stdio トランスポート | ✅ 完全対応 | ✅ 完全対応 | ⚠️ カスタム | ⚠️ カスタム |
| SSE トランスポート | ✅ 完全対応 | ✅ 完全対応 | ⚠️ カスタム | ⚠️ カスタム |
| ツールの検出 | ✅ 自動 | ✅ 自動 | ⚠️ 手動 | ⚠️ 手動 |
| OAuth のサポート | ✅ 完全対応 | ✅ 完全対応 | ⚠️ カスタム | ⚠️ カスタム |
関連スキル
- マルチモデルルーティング - MCP サーバーは、ツール実行パイプラインにモデルルーティングロジックを統合できます
- ナレッジベースの注入 - エージェントが利用できる専門知識を提供するため、ナレッジ検索ツールを MCP 経由で公開します
- 並列エージェントのオーケストレーション - MCP ツールにより、並列サブエージェントのディスパッチで標準化されたツールアクセスが可能になります
- ショッピング広告 - MCP 経由の Merchant Center 統合により、商品フィード管理を自動化できます
キーワード
mcp-server, model-context-protocol, cloudflare-workers, tool-definitions, resource-handlers, sse-transport, stdio-transport, authentication, edge-deployment, agent-skills
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License