Token导航 LogoToken导航

Agent Skill · 研究检索

dynamic-api-integration(dynamic API 集成)

用于辅助 API 设计、接口文档、请求响应结构和服务集成说明。它适合让 Agent 梳理 endpoint、生成 OpenAPI 草稿、检查字段命名、整理错误码或辅助前后端联调。使用时需要确认真实业务语义、鉴权方式、分页和错误处理规则;涉及生成接口文档时,应避免凭空补字段,最好从现有代码、schema 或接口样例中提取事实。

dynamic-api-integration 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证信息还不明确,第三方扫描有未通过项,按安装量在研究检索类的 73,675 个 Skill 里排第 41,842。

总安装 1,129周安装 48GitHub Stars 25下载 396核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:dynamic-api-integration(dynamic API 集成)
来源仓库:https://github.com/oimiragieo/agent-studio
仓库路径:skills/dynamic-api-integration
安装命令:
npx skills add https://github.com/oimiragieo/agent-studio --skill dynamic-api-integration
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/oimiragieo/agent-studio --skill dynamic-api-integration

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

dynamic-api-integration 动态发现与调用外部 HTTP API,支持 OpenAPI 自动解析与语义匹配。适用于需要灵活接入第三方服务的系统集成场景。包含请求构造、错误处理与重试机制的完整工具链封装。需准备 API 文档或 schema 文件以确保 endpoint 映射准确性。

适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/dynamic-api-integration

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/oimiragieo/agent-studio --skill dynamic-api-in…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

dynamic-api-integration 怎么安装?

在终端执行 npx skills add https://github.com/oimiragieo/agent-studio --skill dynamic-api-integration。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

dynamic-api-integration 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

dynamic-api-integration 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

dynamic-api-integration 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

dynamic-api-integration 用的人多吗?

公开数据是累计安装 1,129 次,近一周安装 48 次,下载 396 次,GitHub 25 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

dynamic-api-integration 安全吗?

第三方扫描有未通过项,风险较高。除非你确认过源码,否则不建议直接安装到常用环境。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
dynamic-api-integration

dynamic API 集成 · 本页

1,12925接触敏感数据未明确未通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Mode: Cognitive/Prompt-Driven — No standalone utility script; use via agent context.

Dynamic API Integration

Overview

This skill teaches agents how to dynamically discover, parse, and call external HTTP APIs at runtime. It is adapted from the Universal Tool Calling Protocol (UTCP) patterns, translated into Node.js / Claude Code tool patterns.

Core workflow (5-phase, inspired by UTCP agent state machine):

  1. Discover — Fetch and parse an OpenAPI/Swagger spec (or define a manual tool template).
  2. Match — Map the user's intent to the right API endpoint semantically.
  3. Construct — Build the HTTP request with proper method, path, params, headers, body, and auth.
  4. Execute — Call the API via Bash (curl) or WebFetch and capture the response.
  5. Chain — If the task is not yet complete, re-analyze and execute another call (up to max_iterations).

When to Use

Use this skill when:

  • Agent needs to call an external REST API it has not used before
  • User provides an API URL or OpenAPI spec URL and wants data extracted
  • Agent must discover available endpoints from a spec before choosing which to call
  • Multiple API calls need to be chained iteratively (search -> get details -> filter)
  • Agent needs to construct HTTP requests with authentication and parameters

Do NOT use when:

  • The API is already wrapped as an MCP tool (use the MCP tool directly)
  • The integration is a one-time hardcoded call (just use Bash curl directly)
  • The API requires OAuth 2.0 authorization code flow with user-interactive redirect
  • The API uses WebSocket or streaming-only protocols (not HTTP REST)

Iron Laws

  1. NEVER hardcode API keys, tokens, or secrets in requests, curl commands, or source files — always use environment variables ($ENV_VAR) or a secrets manager.
  2. ALWAYS discover the API spec (OpenAPI/Swagger) before writing any integration code — guessing endpoint shapes without spec evidence produces broken integrations.
  3. NEVER skip pagination handling when the API returns list responses — assuming single-page results silently drops data for any dataset above the page limit.
  4. ALWAYS implement retry logic with exponential backoff for transient failures (429, 503) — dynamic APIs are unreliable by nature and integrations without retries fail under normal production conditions.
  5. NEVER trust API responses without validating the schema of each response before use — dynamic API shapes change without notice; unvalidated responses cause runtime crashes in callers.

Phase 1: Discover — Fetch and Parse the API Spec

Option A: OpenAPI/Swagger Spec Discovery

When the API provides an OpenAPI spec (most modern APIs do):

# Step 1: Fetch the OpenAPI spec
WebFetch({
  url: "https://api.example.com/openapi.json",
  prompt: "Extract all API endpoints. For each endpoint, list: HTTP method, path, description, required parameters, optional parameters, authentication requirement. Return as a structured list."
})

What to extract from the spec:

FieldLocation in SpecPurpose
Base URLservers[0].urlAPI root for all requests
Endpointspaths.*Available operations
Methodspaths.*.get/post/put/deleteHTTP verbs per endpoint
Parameterspaths.*.*.parameters[]Query, path, header params
Request bodypaths.*.*.requestBodyPOST/PUT payload schema
Authcomponents.securitySchemesAPI key, Bearer, OAuth
Response schemapaths.*.*.responses.200Expected response format

Common OpenAPI spec locations:

  • https://api.example.com/openapi.json
  • https://api.example.com/swagger.json
  • https://api.example.com/v3/api-docs
  • https://api.example.com/.well-known/openapi.json
  • https://api.example.com/docs (HTML page may link to spec)

Option B: Manual Tool Template (No Spec Available)

When no OpenAPI spec exists, define a tool template manually:

{
  "name": "search_books",
  "description": "Search Open Library for books by query",
  "base_url": "https://openlibrary.org/search.json",
  "method": "GET",
  "auth": null,
  "parameters": {
    "q": {
      "type": "string",
      "required": true,
      "in": "query",
      "description": "Search query (title, author, ISBN)"
    },
    "limit": {
      "type": "integer",
      "required": false,
      "in": "query",
      "description": "Max results to return (default 10)"
    },
    "page": {
      "type": "integer",
      "required": false,
      "in": "query",
      "description": "Page number for pagination"
    }
  },
  "response_hint": "Returns { numFound, docs: [{ title, author_name, first_publish_year }] }"
}

Tool Template JSON Schema

The tool template format (inspired by UTCP manual_call_templates):

{
  "name": "string (required) — unique tool identifier, lowercase_snake_case",
  "description": "string (required) — what this tool does, used for semantic matching",
  "base_url": "string (required) — full URL including path",
  "method": "string (required) — GET | POST | PUT | PATCH | DELETE",
  "content_type": "string (optional) — default: application/json",
  "auth": {
    "type": "string — api_key | bearer | basic | none",
    "header": "string — header name (e.g., X-Api-Key, Authorization)",
    "env_var": "string — environment variable name holding the secret",
    "prefix": "string (optional) — e.g., 'Bearer ' for bearer auth"
  },
  "parameters": {
    "<param_name>": {
      "type": "string | integer | boolean | array | object",
      "required": "boolean",
      "in": "query | path | header | body",
      "description": "string — what this parameter does",
      "default": "any (optional) — default value if not provided"
    }
  },
  "response_hint": "string (optional) — brief description of response shape"
}

Phase 2: Match — Semantic Intent-to-Endpoint Mapping

Before calling an API, match the user's intent to the correct endpoint:

Step 1: Understand the user's goal

Ask yourself: What data does the user want? What action do they want performed?

Step 2: Map intent to endpoint

User IntentLikely HTTP MethodEndpoint Pattern
"Find / search / list / get"GET/search, /list, /{resource}
"Create / add / register"POST/{resource}
"Update / modify / change"PUT or PATCH/{resource}/{id}
"Delete / remove"DELETE/{resource}/{id}
"Get details about X"GET/{resource}/{id}

Step 3: Select parameters

  • Required parameters: Must be provided (check required: true in spec/template).
  • Optional parameters: Use only if user specified them or they improve results.
  • Path parameters: Substitute into URL (e.g., /repos/{owner}/{repo}).
  • Query parameters: Append as ?key=value&key2=value2.
  • Body parameters: Send as JSON payload in POST/PUT/PATCH.

Phase 3: Construct — Build the HTTP Request

Request Construction Checklist

  1. URL: Base URL + path + path parameter substitution
  2. Method: GET, POST, PUT, PATCH, DELETE
  3. Headers: Content-Type, Authorization, Accept, custom headers
  4. Query parameters: URL-encoded, appended to URL
  5. Body: JSON payload for POST/PUT/PATCH
  6. Auth: Injected from environment variable

Auth Patterns

API Key (Header):

curl -s -X GET "https://api.example.com/data?q=test" \
  -H "X-Api-Key: $API_KEY"

Bearer Token:

curl -s -X GET "https://api.example.com/data" \
  -H "Authorization: Bearer $AUTH_TOKEN"

Basic Auth:

curl -s -X GET "https://api.example.com/data" \
  -u "$USERNAME:$PASSWORD"

No Auth (Public API):

curl -s -X GET "https://api.example.com/data?q=test"

Request Templates by Method

GET with query parameters:

curl -s -X GET "https://api.example.com/search?q=test&limit=10&page=1" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $TOKEN"

POST with JSON body:

curl -s -X POST "https://api.example.com/items" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name": "New Item", "category": "tools", "price": 29.99}'

PUT with path parameter:

curl -s -X PUT "https://api.example.com/items/123" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name": "Updated Item", "price": 39.99}'

DELETE:

curl -s -X DELETE "https://api.example.com/items/123" \
  -H "Authorization: Bearer $TOKEN"

Phase 4: Execute — Call the API and Process the Response

Using Bash (curl) — Primary Method

# Execute and capture response + HTTP status
RESPONSE=$(curl -s -w "\n%{http_code}" -X GET "https://api.example.com/search?q=test" \
  -H "Accept: application/json")
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | sed '$d')

echo "Status: $HTTP_CODE"
echo "Body: $BODY" | head -c 2000  # Truncate to 2KB for context safety

Using WebFetch — When You Need AI Processing

WebFetch({
  url: 'https://api.example.com/search?q=test',
  prompt:
    'Extract the top 5 results with their titles and descriptions. Format as a numbered list.',
});

When to use which:

ScenarioToolReason
Need raw JSON for further processingBash (curl)Full control, parseable output
Need summarized/extracted dataWebFetchAI processes response inline
Need to check HTTP status codesBash (curl)WebFetch abstracts status away
Large response (>50KB)Bash (curl) + truncateWebFetch may timeout on large pages
HTML page (not JSON)WebFetchConverts HTML to markdown

Error Handling

HTTP Status Code Handling:

StatusMeaningAction
200-299SuccessParse response, continue
400Bad RequestCheck parameters, fix and retry
401UnauthorizedCheck API key/token, re-authenticate
403ForbiddenCheck permissions, report to user
404Not FoundCheck URL/resource ID, try alternative endpoint
429Rate LimitedWait (check Retry-After header), then retry
500-599Server ErrorWait and retry up to 3 times

Retry with Exponential Backoff:

# Retry pattern for transient errors (429, 5xx)
for attempt in 1 2 3; do
  RESPONSE=$(curl -s -w "\n%{http_code}" -X GET "$URL" -H "Authorization: Bearer $TOKEN")
  HTTP_CODE=$(echo "$RESPONSE" | tail -1)
  if [ "$HTTP_CODE" -lt 400 ]; then
    break  # Success
  fi
  echo "Attempt $attempt failed ($HTTP_CODE), retrying in $((attempt * 2))s..."
  sleep $((attempt * 2))
done

Response Processing

Parse JSON response (Bash):

# Extract specific fields from JSON response
echo "$BODY" | node -e "
  const data = JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8'));
  console.log('Total:', data.totalResults);
  data.items?.slice(0, 5).forEach((item, i) => {
    console.log(\`\${i+1}. \${item.title} — \${item.description?.substring(0, 80)}\`);
  });
"

Truncate large responses:

# Safety: never pass >10KB of API response into context
BODY_TRUNCATED=$(echo "$BODY" | head -c 10000)
if [ ${#BODY} -gt 10000 ]; then
  echo "[TRUNCATED: Response was $(echo "$BODY" | wc -c) bytes, showing first 10KB]"
fi

Phase 5: Chain — Iterative Multi-Call Workflow

Many tasks require multiple API calls chained together. Use the UTCP-inspired iterative pattern:

Chaining Pattern

Iteration 1: Search -> Get list of results
Iteration 2: Get details for top result
Iteration 3: Perform action on result
(max_iterations guard: stop at 5)

The Iteration Guard (MANDATORY)

MAX_ITERATIONS = 5

Before each API call:
  IF iteration_count >= MAX_ITERATIONS:
    STOP. Summarize what was gathered so far and respond.
  ELSE:
    Execute the call, increment counter, re-analyze task.

Why this matters: Without an iteration guard, an agent could loop indefinitely calling APIs. UTCP uses a default of 3; we recommend 5 for more complex multi-step workflows.

Chaining Examples

Example 1: Search and Get Details

User: "Find information about the book '1984' by George Orwell"

Iteration 1:
  Call: GET https://openlibrary.org/search.json?q=1984+george+orwell&limit=5
  Result: Found 5 matches, top result has key "/works/OL1168083W"

Iteration 2:
  Call: GET https://openlibrary.org/works/OL1168083W.json
  Result: Full book details (title, description, subjects, covers)

Task complete: Return summarized book information.

Example 2: GitHub — Find and Analyze a Repository

User: "What are the most recent issues in the react repository?"

Iteration 1:
  Call: GET https://api.github.com/repos/facebook/react/issues?state=open&per_page=10&sort=created
  Headers: Authorization: Bearer $GITHUB_TOKEN
  Result: 10 most recent open issues

Task complete: Summarize issue titles, labels, and dates.

Example 3: Multi-API Chain

User: "Find news about AI safety and summarize the top article"

Iteration 1:
  Call: GET https://newsapi.org/v2/everything?q=AI+safety&sortBy=publishedAt&pageSize=5
  Headers: X-Api-Key: $NEWS_API_KEY
  Result: 5 articles with titles, URLs

Iteration 2:
  Call: WebFetch({ url: articles[0].url, prompt: "Summarize this article in 3 bullet points" })
  Result: Article summary

Task complete: Return article title + summary.

Real-World API Examples

GitHub API (Bearer Token Auth)

# List repositories for a user
curl -s -X GET "https://api.github.com/users/octocat/repos?sort=updated&per_page=5" \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer $GITHUB_TOKEN"

Tool Template:

{
  "name": "github_list_repos",
  "description": "List repositories for a GitHub user, sorted by most recently updated",
  "base_url": "https://api.github.com/users/{username}/repos",
  "method": "GET",
  "auth": {
    "type": "bearer",
    "header": "Authorization",
    "env_var": "GITHUB_TOKEN",
    "prefix": "Bearer "
  },
  "parameters": {
    "username": {
      "type": "string",
      "required": true,
      "in": "path",
      "description": "GitHub username"
    },
    "sort": {
      "type": "string",
      "required": false,
      "in": "query",
      "description": "Sort field: created, updated, pushed, full_name",
      "default": "updated"
    },
    "per_page": {
      "type": "integer",
      "required": false,
      "in": "query",
      "description": "Results per page (max 100)",
      "default": 10
    }
  }
}

Open Library API (No Auth)

# Search for books
curl -s -X GET "https://openlibrary.org/search.json?q=george+orwell&limit=5" \
  -H "Accept: application/json"

JSONPlaceholder (Testing/Prototyping)

# GET all posts
curl -s https://jsonplaceholder.typicode.com/posts?_limit=5

# POST new item
curl -s -X POST https://jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -d '{"title": "Test Post", "body": "Hello world", "userId": 1}'

Weather API (API Key Auth)

# Get current weather
curl -s "https://api.open-meteo.com/v1/forecast?latitude=51.5074&longitude=-0.1278&current_weather=true"

Context Management for Large Responses

API responses can be very large. Apply these rules to prevent context overflow:

Response Size Limits

Response SizeAction
< 5 KBUse full response
5-20 KBExtract relevant fields only
20-50 KBSummarize via WebFetch or node script
> 50 KBTruncate to first 5KB + count remaining

Extraction Pattern (Recommended for Large Responses)

# Instead of dumping full response, extract what you need
curl -s "https://api.example.com/search?q=test" | node -e "
  const data = JSON.parse(require('fs').readFileSync('/dev/stdin', 'utf8'));
  // Extract only what the user asked for
  const results = data.results.slice(0, 5).map(r => ({
    id: r.id,
    title: r.title,
    summary: r.description?.substring(0, 200)
  }));
  console.log(JSON.stringify(results, null, 2));
"

Security Checklist

  • All API keys stored in environment variables (never in code/commands)
  • HTTPS used for all API calls (never HTTP for authenticated requests)
  • Response data validated before use (check status codes)
  • No user secrets logged or written to files
  • Rate limits respected (check headers: X-RateLimit-Remaining)
  • Sensitive response data (PII, tokens) not stored in memory files
  • Timeout set on all requests (curl --max-time 30)

Verification Checklist

Before completing a dynamic API integration task:

  • API spec was fetched and endpoints were identified
  • User intent was mapped to the correct endpoint and method
  • Request includes proper authentication (if required)
  • Request parameters match the API schema (required params present)
  • HTTP status code was checked and errors handled
  • Response was truncated/summarized if > 5KB
  • Iteration count did not exceed max_iterations (5)
  • No API keys were hardcoded in any command or file

Anti-Patterns (AVOID)

Anti-PatternWhy It FailsCorrect Approach
Hardcoding API keysSecurity risk, breaks when rotatedUse $ENV_VAR in all commands
Calling API without reading spec firstWrong endpoint, wrong parametersDiscover first (Phase 1)
Passing full 100KB response to contextContext overflow, degraded performanceTruncate/extract (Phase 4)
No iteration guard on chained callsInfinite loops burning tokensAlways enforce max_iterations
Guessing parameter names400 errors, wasted callsRead spec/docs before constructing
Ignoring HTTP error codesSilent failures, wrong resultsCheck status, handle 4xx/5xx
Using POST when GET is correctAPI rejects or creates unintended resourcesMatch method to intent (Phase 2)

Quick Reference Card

DISCOVER  → WebFetch(spec_url) or define manual tool template
MATCH     → Map user intent to endpoint + method + params
CONSTRUCT → Build curl command with URL, headers, auth, body
EXECUTE   → Bash(curl) for JSON, WebFetch for HTML/summarize
CHAIN     → Re-analyze task, call again (max 5 iterations)

Auth Quick Reference:

API Key:  -H "X-Api-Key: $KEY"
Bearer:   -H "Authorization: Bearer $TOKEN"
Basic:    -u "$USER:$PASS"
None:     (no auth header needed)

Tool Template Quick Create:

{
  "name": "...",
  "description": "...",
  "base_url": "...",
  "method": "GET",
  "auth": { "type": "api_key", "header": "...", "env_var": "..." },
  "parameters": { "q": { "type": "string", "required": true, "in": "query" } }
}

Research Basis

This skill is adapted from:

Related Skills

  • auth-security-expert — OAuth 2.1, JWT, encryption patterns
  • nodejs-expert — Node.js HTTP patterns
  • debugging — API call failure investigation
  • research-synthesis — Researching new APIs before integration

Memory Protocol

Before starting: Read .claude/context/memory/learnings.md

After completing:

  • New API pattern discovered -> .claude/context/memory/learnings.md
  • API issue/limitation found -> .claude/context/memory/issues.md
  • API design decision made -> .claude/context/memory/decisions.md
  • Reusable tool template created -> save to .claude/context/memory/named/api-templates.md

Assume interruption: if it is not in memory, it did not happen.

平台分布

Codex

36.54%
按下载量换算145

Claude

29.69%
按下载量换算118

Cursor

18.98%
按下载量换算75

Gemini CLI

9.5%
按下载量换算38

安全审计

Gen Agent Trust Hub

未通过

Socket

通过

Snyk

可疑

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills