# Source
URL: https://lsd.tools/docs/api-source
Updated: 2026-07-17

A `Source` is the input a [load step](/docs/tools-load) reads. Annotate a step parameter `Source`
and LSD injects a reader bound to whatever the user picks; or construct one directly with
`Source.file` / `Source.sql` / `Source.of` to drive a load in Python. Either way,
`source.read()` returns a [`Table`](/docs/api-table) — the picker's choice and the code path are
the same object, so a tool works identically whether the source is chosen in the UI or in a script.

## Usage

```python
from lsdtools import Tool, Source, Table

tool = Tool("io")

@tool.load(source_kinds=("file",))
def load_it(src: Source) -> Table:
    return src.read()
# → reads whatever file the user selects in the node's form
```

## Where to start

**Learn** — [Load steps](/docs/tools-load) · [Params vs ports](/docs/tools-params-ports)

**Examples** — [File loader](/docs/ex-file-loader) · [Clean a CSV](/docs/ex-clean-csv)

**API** — [Tool](/docs/api-tool) · [Table](/docs/api-table) · [Context](/docs/api-context)
