Skip to main content
skill CX Codex

api-documentation — Claude Code skill: rules for documenting APIs

A set of rules that tells the agent how to write docstrings, JSDoc, Godoc and endpoint descriptions. Useful when several agents each carry their own copy of the same guidance.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add bobmatnyc/claude-mpm-skills --skill api-documentation -a claude-code
Open on GitHub

What api-documentation does

The skill lays out five principles: explain the why, not just the what; keep docs next to the code; document the contract rather than the implementation; include examples; update docs alongside the code. Then come worked templates per language and format — Python docstrings, JSDoc, Godoc, OpenAPI, GraphQL SDL, and a class description with a usage example.

There is nothing but prose and samples inside. No scripts, no external calls, nothing to install beyond the skill file itself. The author claims it removes roughly 100–150 lines of duplicated documentation guidance per agent, so if your agents repeat the same doc requirements, that is worth a look.

The skill is marked user-invocable: false and disable-model-invocation: true, so there is no slash command to run it by hand. It gets picked up as reference material when the agent writes or edits documentation. The samples all revolve around a discount calculation function, so borrow the section structure rather than the code.

What it helps with

  • write a docstring covering arguments, return value and raised errors
  • describe a REST endpoint in OpenAPI
  • document a GraphQL type and its fields
  • add a class docstring with a usage example and a thread-safety note
  • lay out a README with installation and quick start sections

Example prompts for the agent

  • Document calculate_discount the way the api-documentation skill shows: arguments, return value, exceptions, examples.
  • Describe the GET /users/{userId} endpoint in OpenAPI 3.0 with 200, 404 and 401 responses.
  • Add a docstring to the UserManager class with a usage example and a thread-safety section.

How to install api-documentation

1Skills CLI (Vercel)

npx skills add bobmatnyc/claude-mpm-skills --skill api-documentation -a claude-code

2Manually: put the files in place

~/.claude/skills/api-documentation/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/api-documentation/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about api-documentation

How do I install api-documentation in Claude?

Run npx skills add bobmatnyc/claude-mpm-skills --skill api-documentation -a claude-code. The skill file lands at ~/.claude/skills/api-documentation/SKILL.md.

What does api-documentation do?

It gives the agent one consistent set of rules for documenting code and APIs: docstrings, JSDoc, Godoc, OpenAPI, GraphQL. Instead of repeating that guidance in every agent, you keep it in a single skill.

Can I invoke the skill manually?

No. It carries user-invocable: false and disable-model-invocation: true, so there is no slash command — it works as reference material.

Source text

SKILL.md · MIT
---
name: api-documentation
description: Best practices for documenting APIs and code interfaces, eliminating redundant documentation guidance per agent.
user-invocable: false
disable-model-invocation: true
updated_at: 2025-10-30T17:00:00Z
tags: [api, documentation, best-practices, interfaces]
progressive_disclosure:
  entry_point:
    summary: "Best practices for documenting APIs and code interfaces, eliminating redundant documentation guidance per agent."
    when_to_use: "When designing, implementing, or documenting APIs."
    quick_start: "1. Review the core concepts below. 2. Apply patterns to your use case. 3. Follow best practices for implementation."
---
# API Documentation

Best practices for documenting APIs and code interfaces. Eliminates ~100-150 lines of redundant documentation guidance per agent.

## Core Documentation Principles

1. **Document the why, not just the what** - Explain intent and rationale
2. **Keep docs close to code** - Inline documentation stays synchronized
3. **Document contracts, not implementation** - Focus on behavior
4. **Examples are essential** - Show real usage
5. **Update docs with code** - Outdated docs are worse than no docs

## Function/Method Documentation

### Python (Docstrings)

```python
def calculate_discount(price: float, discount_percent: float) -> float:
    """
    Calculate discounted price with percentage off.

    Args:
        price: Original price in dollars (must be positive)
        discount_percent: Discount percentage (0-100)

    Returns:
        Final price after discount, rounded to 2 decimals

    Raises:
        ValueError: If price is negative or discount > 100

    Examples:
        >>> calculate_discount(100.0, 20.0)
        80.0
        >>> calculate_discount(50.0, 50.0)
        25.0

    Note:
        Discount percent is capped at 100% (minimum price of 0)
    """
    if price < 0:
        raise ValueError("Price cannot be negative")
    if discount_percent > 100:
        raise ValueError("Discount cannot exceed 100%")

    discount_amount = price * (discount_percent / 100)
    return round(price - discount_amount, 2)
```

### JavaScript (JSDoc)

```javascript
/**
 * Calculate discounted price with percentage off
 *
 * @param {number} price - Original price in dollars (must be positive)
 * @param {number} discountPercent - Discount percentage (0-100)
 * @returns {number} Final price after discount, rounded to 2 decimals
 * @throws {Error} If price is negative or discount > 100
 *
 * @example
 * calculateDiscount(100.0, 20.0)
 * // returns 80.0
 *
 * @example
 * calculateDiscount(50.0, 50.0)
 * // returns 25.0
 */
function calculateDiscount(price, discountPercent) {
  if (price < 0) {
    throw new Error('Price cannot be negative');
  }
  if (discountPercent > 100) {
    throw new Error('Discount cannot exceed 100%');
  }

  const discountAmount = price * (discountPercent / 100);
  return Math.round((price - discountAmount) * 100) / 100;
}
```

### Go (Godoc)

```go
// CalculateDiscount calculates discounted price with percentage off.
//
// The function applies the given discount percentage to the original price
// and returns the final price rounded to 2 decimal places.
//
// Parameters:
//   - price: Original price in dollars (must be positive)
//   - discountPercent: Discount percentage (0-100)
//
// Returns the final price after discount.
//
// Returns an error if price is negative or discount exceeds 100%.
//
// Example:
//
//	finalPrice, err := CalculateDiscount(100.0, 20.0)
//	// finalPrice = 80.0
func CalculateDiscount(price, discountPercent float64) (float64, error) {
    if price < 0 {
        return 0, errors.New("price cannot be negative")
    }
    if discountPercent > 100 {
        return 0, errors.New("discount cannot exceed 100%")
    }

    discountAmount := price * (discountPercent / 100)
    return math.Round((price-discountAmount)*100) / 100, nil
}
```

## API Endpoint Documentation

### REST API (OpenAPI/Swagger)

```yaml
openapi: 3.0.0
info:
  title: User Management API
  version: 1.0.0

paths:
  /users/{userId}:
    get:
      summary: Get user by ID
      description: Retrieves detailed information for a specific user
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: integer
            minimum: 1
          description: Unique user identifier
      responses:
        '200':
          description: User found successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example:
                id: 123
                name: "John Doe"
                email: "[email protected]"
        '404':
          description: User not found
        '401':
          description: Unauthorized - authentication required
```

### GraphQL

```graphql
"""
Represents a user in the system
"""
type User {
  """Unique identifier for the user"""
  id: ID!

  """User's full name"""
  name: String!

  """User's email address (validated)"""
  email: String!

  """User's posts (paginated)"""
  posts(limit: Int = 10, offset: Int = 0): [Post!]!
}

"""
Query a specific user by ID
"""
type Query {
  """
  Get user by unique identifier

  Returns null if user not found
  """
  user(id: ID!): User
}
```

## Class/Module Documentation

```python
class UserManager:
    """
    Manages user accounts and authentication.

    This class provides a high-level interface for user management
    operations including creation, authentication, and profile updates.

    Attributes:
        db: Database connection instance
        cache: Redis cache for session management

    Example:
        >>> manager = UserManager(db=get_db(), cache=get_cache())
        >>> user = manager.create_user("[email protected]", "password")
        >>> authenticated = manager.authenticate("[email protected]", "password")
        >>> authenticated is not None
        True

    Thread Safety:
        This class is thread-safe. Multiple threads can safely call
        methods concurrently.

    Note:
        All passwords are automatically hashed using bcrypt before
        storage. Never pass pre-hashed passwords to methods.
    """

    def __init__(self, db: Database, cache: Cache):
        """
        Initialize UserManager with database and cache.

        Args:
            db: Database connection for persistent storage
            cache: Redis cache for session management

        Raises:
            ConnectionError: If unable to connect to database or cache
        """
        self.db = db
        self.cache = cache
```

## README Documentation Structure

```markdown
# Project Name

Brief description of what the project does (1-2 sentences).

## Features

- Key feature 1
- Key feature 2
- Key feature 3

## Installation

```bash
pip install project-name
```

## Quick Start

```python
from project import MainClass

# Simple usage example
client = MainClass(api_key="your-key")
result = client.do_something()
print(result)
```

## Configuration

| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `api_key` | str | None | API authentication key |
| `timeout` | int | 30 | Request timeout in seconds |

## API Reference

See full [API Documentation](docs/api.md)

### Main Methods

#### `do_something(param1, param2)`

Description of what this does.

**Parameters:**
- `param1` (str): Description of param1
- `param2` (int): Description of param2

**Returns:** Description of return value

**Example:**
```python
result = client.do_something("value", 42)
```

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md)

## License

MIT License - see [LICENSE](LICENSE)
```

## Documentation Anti-Patterns

### ❌ Redundant Comments

```python
# Bad: Obvious comment adds no value
i = i + 1  # Increment i

# Good: Comment explains WHY
i = i + 1  # Skip header row
```

### ❌ Outdated Documentation

```python
# Bad: Comment doesn't match code
def get_users(limit=10):  # Comment says: Returns all users
    """Returns all users in the system."""  # But limit is 10!
    return User.query.limit(limit).all()

# Good: Keep docs synchronized
def get_users(limit=10):
    """
    Returns up to 'limit' users from the system.

    Args:
        limit: Maximum number of users to return (default: 10)
    """
    return User.query.limit(limit).all()
```

### ❌ Implementation Documentation

```python
# Bad: Documents HOW (implementation)
def sort_users(users):
    """Uses bubble sort algorithm to sort users."""  # Don't care!
    ...

# Good: Documents WHAT (contract)
def sort_users(users):
    """Returns users sorted alphabetically by name."""
    ...
```

## Documentation Tools

### Python
- **Sphinx**: Generate HTML docs from docstrings
- **pdoc**: Simpler alternative to Sphinx
- **MkDocs**: Markdown-based documentation

### JavaScript
- **JSDoc**: Generate HTML from JSDoc comments
- **TypeDoc**: For TypeScript projects
- **Docusaurus**: Full documentation websites

### Go
- **godoc**: Built-in documentation tool
- **pkgsite**: Go package documentation

### Rust
- **rustdoc**: Built-in documentation with `cargo doc`

## Quick Documentation Checklist

```
□ Public APIs have docstrings/comments
□ Parameters and return values documented
□ Exceptions/errors documented
□ Usage examples provided
□ Edge cases and limitations noted
□ README includes quick start
□ API reference available
□ Configuration options documented
□ Docs are up to date with code
□ Breaking changes documented
```

## Remember

- **Code is read more than written** - Good docs save time
- **Examples speak louder than descriptions** - Show, don't just tell
- **The best docs are no docs** - Write self-documenting code
- **Keep it DRY** - Don't repeat what the code already says
- **Update docs with code** - Outdated docs mislead developers

© bobmatnyc · MIT · bobmatnyc/claude-mpm-skills

Similar skills

Everything for Writing and docs →

From the same set66

kysely A skill that teaches your agent Kysely: types from schema to query result, migrations, transactions. Useful when an ORM gets in the way but untyped raw SQL is worse. CX Codex +1 389installs kubernetes A Kubernetes operations playbook for your agent: safe rollouts, health probes, resource sizing and fast kubectl triage. CX Codex +1 383installs systematic-debugging This skill guides an agent from reproducing a bug to checking the fix. Use it when an error or unexpected behavior has no clear cause. CX Codex +1 382installs vue A Vue 3 skill for your coding agent: Composition API, reactivity, single-file components, Vue Router, Pinia, TypeScript and Vite. Useful when the agent writes Vue frontend code. CX Codex +1 381installs software-patterns Compares tradeoffs between architectural patterns and points to the one that fits your problem: coupling, resilience, service boundaries. Useful when code resists testing. CX Codex +1 373installs nextjs-v16 A skill that walks a project through the Next.js 16 migration: async request APIs, opt-in caching with "use cache", Turbopack. Useful when upgrading an existing app. CX Codex +1 371installs testing-anti-patterns A skill for spotting tests that verify mock behavior, add test-only production methods, or use incomplete mocks. CX Codex +1 368installs vercel-deployments-builds Walks through the Vercel deployment lifecycle: builds, previews, release phases and rollback. Useful when you configure build output or control releases. CX Codex +1 368installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor