Communitygithub.com

DataShrimp/skills

建立高品質 MCP(Model Context Protocol)伺服器的指南,讓大型語言模型能夠透過精心設計的工具與外部服務互動。在開發整合外部 API 或服務的 MCP 伺服器時使用,無論是 Python (FastMCP) 還是 Node/TypeScript (MCP SDK)。

skills 是什麼?

此技能 DataShrimp/skills 提供了建立高品質 MCP(Model Context Protocol)伺服器的完整指南,目標是讓 LLM(大型語言模型)能透過設計良好的工具與外部服務順暢互動。它涵蓋了四個主要階段:深入的研究與規劃、實作、審查與測試,以及建立評量。文件中特別強調工具命名的一致性、清楚的輸入輸出描述、情境管理,以及可操作的錯誤訊息,以確保 LLM 能有效地發現並使用這些工具。 此技能不僅包含官方 Anthropic 的 mcp-builder 指南,還整合了多種平台的技能規範範例,包括 Claude Code 的動態情境注入、OpenAI ChatGPT/Codex 的 sidecar 架構,以及 Agent Skills 的 PEP 723 自包含腳本。這使得開發者可以獲得跨平台的參考,並根據不同執行環境(如 TypeScript 或 Python)調整實作方式。 透過遵循此指南,開發者能夠建立出不僅涵蓋 API 端點,還包含專屬工作流程工具的 MCP 伺服器。最終產出的伺服器將更具可用性、可維護性,並能通過預先設計的評量問題來驗證其效能,確保 LLM 能有效完成真實世界任務。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/DataShrimp/skills/tree/HEAD/MetaPrompt/02-official-and-frameworks/anthropic-mcp-builder

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

來源出處


第一部分:Anthropic 官方 mcp-builder/SKILL.md(三層漸進式揭露範例)

概述

建立 MCP(Model Context Protocol)伺服器,讓 LLM 能夠透過設計良好的工具與外部服務互動。MCP 伺服器的品質取決於它能多好地讓 LLM 完成真實世界的任務。


流程

🚀 高階工作流程

建立一個高品質的 MCP 伺服器包含四個主要階段:

第一階段:深入研究與規劃

1.1 了解現代 MCP 設計

API 覆蓋率 vs. 工作流程工具: 在全面的 API 端點覆蓋率與專業的工作流程工具之間取得平衡。工作流程工具對於特定任務可能更方便,而全面的覆蓋率則給予代理靈活性來組合操作。效能因客戶端而異——某些客戶端受益於結合基本工具的程式碼執行,而其他客戶端則更適合較高層級的工作流程。在不確定的情況下,優先考慮全面的 API 覆蓋率。

工具命名與可發現性: 清晰、描述性的工具名稱可幫助代理快速找到正確的工具。使用一致的 prefix(例如 github_create_issue、github_list_repos)以及以動作為導向的命名。

情境管理: 代理受益於簡潔的工具描述以及篩選/分頁結果的能力。設計能夠回傳聚焦且相關資料的工具。某些客戶端支援程式碼執行,這可以幫助代理有效地篩選和處理資料。

可操作的錯誤訊息: 錯誤訊息應引導代理走向解決方案,提供具體建議和後續步驟。

1.2 研讀 MCP 協定文件

瀏覽 MCP 規格: 從 sitemap 開始尋找相關頁面:https://modelcontextprotocol.io/sitemap.xml 然後取得特定頁面,並加上 .md 後綴以取得 Markdown 格式(例如 https://modelcontextprotocol.io/specification/draft.md)。

需要檢閱的關鍵頁面:

  • 規格概述與架構
  • 傳輸機制(可串流的 HTTP、stdio)
  • 工具、資源與提示的定義

1.3 研讀框架文件

建議的技術堆疊:

  • 語言: TypeScript(高品質的 SDK 支援,且在許多執行環境(例如 MCPB)中具有良好的相容性。此外,AI 模型擅長生成 TypeScript 程式碼,受益於其廣泛使用、靜態型別和良好的 linting 工具)
  • 傳輸: 遠端伺服器使用可串流的 HTTP,採用無狀態 JSON(比有狀態 session 和串流回應更容易擴展和維護)。本地伺服器使用 stdio。

載入框架文件:

1.4 規劃你的實作

了解 API: 檢閱服務的 API 文件,以識別關鍵端點、驗證需求和資料模型。必要時可使用網路搜尋和網頁擷取。

工具選擇: 優先考慮全面的 API 覆蓋率。列出要實作的端點,從最常見的操作開始。


第二階段:實作

2.1 設定專案結構

請參閱特定語言的專案設定指南:

2.2 實作核心基礎設施

建立共享的公用程式:

  • 具有驗證功能的 API 客戶端
  • 錯誤處理輔助函式
  • 回應格式化(JSON 和 Markdown)
  • 分頁支援

2.3 實作工具

對於每個工具:

輸入 schema:

  • 使用 Zod (TypeScript) 或 Pydantic (Python)
  • 包含約束條件和清晰的描述
  • 在欄位描述中加入範例

輸出 schema:

  • 盡可能定義 outputSchema 以處理結構化資料
  • 在工具回應中使用 structuredContent(TypeScript SDK 功能)
  • 幫助客戶端理解和處理工具輸出

工具描述:

  • 功能簡潔摘要
  • 參數描述
  • 回傳值 schema

實作:

  • 對 I/O 操作使用 async/await
  • 使用可操作的訊息進行適當的錯誤處理
  • 在適用的情況下支援分頁
  • 使用現代 SDK 時回傳純文字內容和結構化資料

註解:

  • readOnlyHint: true/false
  • destructiveHint: true/false
  • idempotentHint: true/false
  • openWorldHint: true/false

第三階段:審查與測試

3.1 程式碼品質

檢查:

  • 無重複程式碼(DRY 原則)
  • 一致的錯誤處理
  • 完整的型別涵蓋率
  • 清晰_tool 描述 (原文為 clear_tool descriptions)

3.2 建置與測試

TypeScript:

  • 執行 npm run build 驗證編譯
  • 使用 MCP Inspector 測試:npx @modelcontextprotocol/inspector

Python:

  • 驗證語法:python -m py_compile your_server.py
  • 使用 MCP Inspector 測試

請參閱特定語言的指南以獲取詳細的測試方法和品質檢查清單。


第四階段:建立評量

在實作你的 MCP 伺服器之後,建立全面的評量來測試其有效性。

載入 ✅ 評量指南 以獲取完整的評量指引。

4.1 了解評量目的

使用評量來測試 LLM 是否能有效地使用你的 MCP 伺服器來回答真實、複雜的問題。

4.2 建立 10 個評量問題

為了建立有效的評量,請遵循評量指南中概述的流程:

  1. 工具檢查: 列出可用的工具並了解其能力
  2. 內容探索: 使用唯讀操作來探索可用的資料
  3. 問題生成: 建立 10 個複雜、真實的問題
  4. 答案驗證: 自己解決每個問題以驗證答案

4.3 評量需求

確保每個問題:

  • 獨立: 不依賴於其他問題
  • 唯讀: 僅需要非破壞性操作
  • 複雜: 需要多次工具呼叫和深入探索
  • 真實: 基於人類會關心的實際使用案例
  • 可驗證: 單一、明確的答案,可透過字串比對驗證
  • 穩定: 答案不會隨時間改變

4.4 輸出格式

建立一個具有以下結構的 XML 檔案:

<evaluation>
  <qa_pair>
    <question>尋找關於 AI 模型發布的討論,其代號為動物。一個模型需要一個特定的安全標籤,格式為 ASL-X。為命名為斑點野生貓科動物的模型確定的數字 X 是多少?</question>
    <answer>3</answer>
  </qa_pair>
<!-- 更多 qa_pairs... -->
</evaluation>

參考檔案

📚 文件庫

根據需要在開發過程中載入這些資源:

核心 MCP 文件(優先載入)

  • MCP 協定: 從 sitemap https://modelcontextprotocol.io/sitemap.xml 開始,然後取得特定頁面並加上 .md 後綴
  • 📋 MCP 最佳實踐 - 通用 MCP 指南,包括:
    • 伺服器和工具命名慣例
    • 回應格式指南(JSON vs Markdown)
    • 分頁最佳實踐
    • 傳輸選擇(可串流 HTTP vs stdio)
    • 安全與錯誤處理標準

SDK 文件(在第一/二階段載入)

  • Python SDK: 從 https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md 取得
  • TypeScript SDK: 從 https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.md 取得

特定語言的實作指南(在第二階段載入)

評量指南(在第四階段載入)


第二部分:Claude Code 動態情境注入 (!command``) 技能範例

---
name: pr-summary
description: 總結拉取請求中的變更。當使用者要求檢視、總結或稽核目前的 PR 或分支差異時使用。
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---

## 拉取請求情境
- PR 差異:!`gh pr diff`
- PR 評論:!`gh pr view --comments`
- 已變更檔案:!`gh pr diff --name-only`

## 你的任務
總結此拉取請求,包含具體的檔案層級風險、重大變更和驗證步驟...

第三部分:OpenAI Codex / ChatGPT agents/openai.yaml Sidecar Schema

interface:
  display_name: "自我進化元提示與角色架構師"
  short_description: "跨工具編譯、評估和調整提示、技能和代理角色"
  icon_small: "./assets/icon-small.svg"
  icon_large: "./assets/icon-large.png"
  brand_color: "#2563EB"
  default_prompt: "使用評估計分卡設計或最佳化提示、技能或代理角色定義。"

policy:
  allow_implicit_invocation: true

dependencies:
  tools:
    - type: "mcp"
      value: "git"
      description: "用於儲存庫檢查的 Git MCP 伺服器"

第四部分:Agent Skills PEP 723 自包含腳本 Harness 範例

# /// script
# dependencies = [
#   "pydantic>=2.0",
# ]
# requires-python = ">=3.10"
# ///
"""專為透過 `uv run` 呼叫 Agent Skill 而設計的自包含非互動式 CLI 腳本。"""

import argparse
import json
import sys


def main() -> int:
    parser = argparse.ArgumentParser(
        description="在不使用互動式提示的情況下,驗證技能或角色的 frontmatter 和 token 預算。"
    )
    parser.add_argument("--input", required=True, help="目標 Markdown 檔案的路徑")
    parser.add_argument("--max-chars", type=int, default=12000, help="字元預算上限")
    parser.add_argument("--dry-run", action="store_true", help="預覽檢查而不寫入")
    args = parser.parse_args()

    try:
        with open(args.input, "r", encoding="utf-8") as f:
            text = f.read()
    except FileNotFoundError:
        sys.stderr.write(
            f"錯誤:找不到檔案 '{args.input}'。請透過 --input <path> 傳入有效路徑。\n"
        )
        return 1

    char_count = len(text)
    passed = char_count <= args.max_chars
    result = {
        "file": args.input,
        "char_count": char_count,
        "max_chars": args.max_chars,
        "passed": passed,
        "remediation": None if passed else f"請刪減 {char_count - args.max_chars} 個字元,或將詳細資訊移至 references/。",
    }
    sys.stdout.write(json.dumps(result, ensure_ascii=False, indent=2) + "\n")
    return 0 if passed else 2


if __name__ == "__main__":
    sys.exit(main())

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能