036511ab3e
Broadens both reach (more tools) and content types (an MCP server), continuing the multi-platform story. Windsurf + Aider: - build-exports.mjs gains two platforms: exports/windsurf/*.md (workspace rules, trigger: model_decision) and exports/aider/*.md (conventions for `aider --read`). Now 5 platforms (ChatGPT, Gemini, Cursor, Windsurf, Aider). - install.sh + bin/cli.mjs install both (windsurf -> .windsurf/rules, aider -> .aider/skills with a --read hint); generated README index is excluded from copies. - One-line windsurf-install.sh / aider-install.sh wrappers for parity. MCP server (new content type): - mcp/server.mjs — zero-dependency stdio MCP server exposing list_skills, search_skills, get_skill. Published as a second bin (pm-claude-skills-mcp). Logs to stderr; reads bundled skills/ at startup. mcp/README.md documents client config. Also: README hero "See it in action" demo placement (ready to swap in a GIF; recording guide in web/docs-assets/README.md), Works-With table + exports + install docs updated, CHANGELOG Unreleased. package.json files/bin updated. Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px Co-authored-by: Claude <noreply@anthropic.com>
152 lines
5.3 KiB
Markdown
152 lines
5.3 KiB
Markdown
# API Docs Writer Skill
|
||
|
||
This skill transforms raw API specs, endpoint descriptions, or Postman collections into clean, developer-facing documentation following OpenAPI-adjacent conventions. Output is ready for a developer portal, README, or Notion/Confluence page.
|
||
|
||
## Required Inputs
|
||
|
||
Ask the user for these if not provided:
|
||
- **API or endpoint details** (raw spec, Postman export, or verbal description)
|
||
- **Auth method** (API key / Bearer token / OAuth 2.0 / None)
|
||
- **Base URL**
|
||
- **API version** (e.g. v1, v2.3, or "unversioned" — affects deprecation notes and versioning headers)
|
||
- **Rate limits** (requests per second/minute per token or IP, if known — or "unknown")
|
||
- **Audience** (internal developers / external partners / public)
|
||
- **Output format** (Markdown for developer portals and READMEs / Plain prose for Confluence or Notion — note: OpenAPI YAML is not produced by this skill)
|
||
|
||
## Output Format
|
||
|
||
For each endpoint, produce the following:
|
||
|
||
---
|
||
|
||
## `[METHOD] /path/to/endpoint`
|
||
|
||
**Summary:** [One line — what this endpoint does]
|
||
|
||
**Description:** [2–4 sentences. When to use this endpoint. What it returns. Any important behaviour to know (pagination, rate limits, async processing, etc.)]
|
||
|
||
**Authentication:** [Required / Optional — method]
|
||
|
||
---
|
||
|
||
### Request
|
||
|
||
**Headers:**
|
||
|
||
| Header | Required | Description |
|
||
|---|---|---|
|
||
| `Authorization` | Yes | `Bearer <token>` |
|
||
| `Content-Type` | Yes | `application/json` |
|
||
|
||
**Path Parameters:**
|
||
|
||
| Parameter | Type | Required | Description |
|
||
|---|---|---|---|
|
||
| `id` | string | Yes | Unique identifier for the resource |
|
||
|
||
**Query Parameters:**
|
||
|
||
| Parameter | Type | Required | Default | Description |
|
||
|---|---|---|---|---|
|
||
| `limit` | integer | No | 20 | Max results per page (1–100) |
|
||
| `cursor` | string | No | — | Pagination cursor from previous response |
|
||
|
||
**Request Body:**
|
||
|
||
```json
|
||
{
|
||
"field_name": "value",
|
||
"another_field": 42
|
||
}
|
||
```
|
||
|
||
| Field | Type | Required | Description |
|
||
|---|---|---|---|
|
||
| `field_name` | string | Yes | [Plain description of what this field does] |
|
||
| `another_field` | integer | No | [Description. Include valid range or enum values if applicable] |
|
||
|
||
---
|
||
|
||
### Response
|
||
|
||
**Success Response: `200 OK`**
|
||
|
||
```json
|
||
{
|
||
"id": "abc123",
|
||
"status": "active",
|
||
"created_at": "2025-04-01T10:00:00Z"
|
||
}
|
||
```
|
||
|
||
| Field | Type | Description |
|
||
|---|---|---|
|
||
| `id` | string | Unique identifier for the created/retrieved resource |
|
||
| `status` | string | Current status. Enum: `active`, `inactive`, `pending` |
|
||
| `created_at` | ISO 8601 string | Timestamp of creation in UTC |
|
||
|
||
---
|
||
|
||
### Error Codes
|
||
|
||
| Status Code | Error Code | Description | How to Resolve |
|
||
|---|---|---|---|
|
||
| `400` | `INVALID_REQUEST` | Request body is malformed or missing required fields | Check request body against schema above |
|
||
| `401` | `UNAUTHORIZED` | Missing or invalid authentication token | Verify your API key or refresh your token |
|
||
| `404` | `NOT_FOUND` | The requested resource does not exist | Check the ID in the path parameter |
|
||
| `429` | `RATE_LIMITED` | Too many requests | Back off and retry after `Retry-After` header value |
|
||
| `500` | `INTERNAL_ERROR` | Unexpected server error | Retry with exponential backoff; contact support if persists |
|
||
|
||
---
|
||
|
||
### Code Examples
|
||
|
||
Produce examples in at least 2 languages relevant to the audience (default: cURL + Python):
|
||
|
||
**cURL:**
|
||
```bash
|
||
curl -X POST https://api.example.com/v1/endpoint \
|
||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"field_name": "value"}'
|
||
```
|
||
|
||
**Python:**
|
||
```python
|
||
import requests
|
||
|
||
response = requests.post(
|
||
"https://api.example.com/v1/endpoint",
|
||
headers={"Authorization": "Bearer YOUR_TOKEN"},
|
||
json={"field_name": "value"}
|
||
)
|
||
data = response.json()
|
||
```
|
||
|
||
---
|
||
|
||
## Quality Checks
|
||
|
||
- [ ] Every parameter is documented (type, required/optional, description)
|
||
- [ ] Response fields are fully documented with types
|
||
- [ ] All relevant error codes are listed with resolution guidance
|
||
- [ ] Error codes cover at minimum: 400 (bad request), 401/403 (auth), 404 (not found), 429 (rate limited), 500 (server error) — or explicitly note which don't apply to this endpoint
|
||
- [ ] Code examples use the actual base URL and a realistic placeholder token — no examples reference undefined variables or "YOUR_ENDPOINT" outside the snippet
|
||
- [ ] Auth method is clearly stated at the top
|
||
- [ ] Enum values are listed where applicable
|
||
- [ ] Pagination documented if the endpoint is a list endpoint
|
||
|
||
## Anti-Patterns
|
||
|
||
- [ ] Do not document only the happy path — every endpoint must have error codes for at least 400, 401/403, 404, 429, and 500
|
||
- [ ] Do not use placeholder values like "YOUR_ENDPOINT" or "INSERT_TOKEN" in code examples — use realistic-looking placeholders anchored to the actual base URL
|
||
- [ ] Do not skip enum values for fields with a fixed set of accepted values — undocumented enums cause integration bugs
|
||
- [ ] Do not omit pagination documentation on list endpoints — developers who miss this will build integrations that silently miss data
|
||
- [ ] Do not describe what a field "is" without describing what it "does" — "the ID" is not documentation; "the unique identifier used to retrieve or update this resource" is
|
||
|
||
## Usage Examples
|
||
- "Document this API endpoint: [paste spec or description]"
|
||
- "Turn this Postman collection into developer docs"
|
||
- "Write API reference docs for [endpoint]"
|
||
- "Write a developer guide for our [product] API"
|