mcpField
M
mcp-server-creation

mcp-server-creation

github.com/itallstartedwithaidea開発4475 回インストール28 週間前に更新
リポジトリ

mcp-server-creation について

mcp-server-creationは、MCPサーバーの設計とデプロイを支援するAgent Skillsのワークフローです。AIエージェントにツールやデータを提供する開発者向けに、プリミティブ、トランスポート、認証、Cloudflare Workersへのデプロイを扱います。

主な機能

  1. 01ツール、リソース、プロンプトの設計
  2. 02stdioとSSE/HTTPトランスポート
  3. 03トランスポート層の認証
  4. 04Cloudflare Workersへのデプロイ
  5. 05構造化された結果とエラー処理

活用シーン

  1. 01MCP経由で独自ツールを公開
  2. 02複数のMCPクライアント向け連携の構築
  3. 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);

ベストプラクティス

  1. ツールをいつ使用するかが伝わる説明を書く — AI エージェントは説明に基づいてツールを選択します。「推奨を行う前に使用する」は、モデルが従える実用的な指針です。
  2. 説明的な列挙型を含む Zod スキーマを使用する — パラメーターの型を制約することで無効な入力を排除できます。特に列挙型は、モデルによるパラメーターの選択を効果的に導きます。
  3. 文章ではなく、構造化された JSON を返す — 構造化された結果はモデルが推論しやすく、説明文よりも使用するトークンが少なくなります。
  4. トランスポート層で認証を実装する — MCP サーバーを認証なしで公開しないでください。ツールへのルーティング前に検証される OAuth、JWT、または API キーを使用します。
  5. ツール数を絞る — 適切に設計された 5~10 個のツールは、重複する 50 個のツールよりも優れています。モデルは、選択肢が少なく明確な場合に、より適切に機能します。
  6. 複数の MCP クライアントでテストする — Claude Code、Cursor、その他のクライアントでは動作が異なる場合があります。対象となる各クライアントでツールの呼び出しをテストしてください。
  7. Cloudflare Workers を使用してエッジにデプロイする — エッジへのデプロイにより、地理的に分散したユーザーのレイテンシーを最小限に抑え、組み込みの DDoS 保護を利用できます。
  8. MCP サーバーをバージョン管理する — ツールの進化に合わせて、後方互換性を維持するか、既存のクライアント設定を破壊しないように明確にバージョンを上げてください。

プラットフォームの互換性

機能Claude CodeCursorCodexGemini CLI
MCP クライアントのサポート✅ ネイティブ✅ ネイティブ⚠️ 制限あり⚠️ 制限あり
stdio トランスポート✅ 完全対応✅ 完全対応⚠️ カスタム⚠️ カスタム
SSE トランスポート✅ 完全対応✅ 完全対応⚠️ カスタム⚠️ カスタム
ツールの検出✅ 自動✅ 自動⚠️ 手動⚠️ 手動
OAuth のサポート✅ 完全対応✅ 完全対応⚠️ カスタム⚠️ カスタム

関連スキル

キーワード

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

コメント