--- layout: tap site_name: tap tap_name: limit description: "Take first N rows (head) or skip M then take N (offset+limit)" intent: read columns: [] args: - name: n type: number default: 10 description: "Number of rows to take" - name: offset type: number default: 0 description: "Rows to skip before taking" args_json: | {"n":{"type":"number","default":10,"description":"Number of rows to take"},"offset":{"type":"number","default":0,"description":"Rows to skip before taking"}} health_json: | {"min_rows":1,"non_empty":[]} example_args: "" source_url: https://github.com/LeonTing1010/tap-skills/blob/main/showcase/tap/limit.plan.json license: MIT ---

## What it does

Take first N rows (head) or skip M then take N (offset+limit)

## Install Taprun once

Taprun ships as a single MCP server exposing a catalog of compiled taps. One-time setup on macOS / Linux:

    brew install LeonTing1010/tap/taprun
    tap mcp connect

Or drop this into your `claude_desktop_config.json` (works identically in Claude Code, Cursor, Cline, Windsurf — any MCP host):

    {
      "mcpServers": {
        "tap": {
          "command": "tap",
          "args": ["mcp", "start"]
        }
      }
    }

## Call `tap/limit`

Terminal, once installed:

    tap run tap/limit

From the MCP host — exact same compiled plan, deterministic replay, zero LLM tokens:

    tap.run({ site: "tap", name: "limit" })

## Why compile it once

This plan was forged once — the AI read `tap`, picked stable structural addresses (JSON-LD, ARIA, RSS, or declared API endpoints, in that priority order), and saved them to a `.plan.json`. Every replay since then has used zero LLM tokens. When `tap` ships a site change that breaks the extraction, `tap verify` surfaces it before your data goes stale — not after your pipeline silently writes garbage for a week.

## Related tap taps

tap | description
--- | ---
`tap/table` | Format rows as a human-readable table (outputs one row per line)
`tap/filter` | Filter rows where field matches condition (gt, lt, eq, contains)
`tap/sort` | Sort rows by field (numeric or alphabetic, asc or desc)
`tap/pick` | Select specific columns from rows (projection)
`tap/dedupe` | Remove duplicate rows by field value