# Getting started

> Install the CLI, scaffold a JavaScript or TypeScript function project, and run your first function locally.

This page walks you through installing the CLI, scaffolding a project, and running your first JavaScript function locally.

## Prerequisites

- Node.js 20 or later.
- The `uip` CLI with the functions tool:

```bash
npm install -g @uipath/cli
uip tools install @uipath/function-tool
```

- A UiPath account with access to Orchestrator, for publishing and invoking.

## Scaffold a project

```bash
uip function new my-functions -l ts
cd my-functions
```

TypeScript is the default; pass `-l js` for JavaScript, or `--empty` to skip the sample function.

The scaffold creates:

| File | Purpose |
|---|---|
| `functions/hello.ts` | Your function logic — one function per file. Starts as a runnable example. |
| `functions/_*.ts` | Shared helpers. A leading underscore marks a file as a helper, so it gets no entry point and no trigger. |
| `uipath.json` | Maps function names to their entry points. |
| `package.json`, `tsconfig.json` | Standard project files. |

## Write your first function

```typescript

interface HelloInput {
  name: string;
}

interface HelloOutput {
  message: string;
}

export default defineFunction({
  name: "hello",
  method: "POST",
  path: "/hello",
  input: defineSchema<HelloInput>(),
  output: defineSchema<HelloOutput>(),
  handler: async (input) => ({ message: `Hello, ${input.name}!` }),
});
```

`defineSchema<T>()` derives the JSON Schema from your TypeScript interface, so the same type declares the contract and types the handler. In JavaScript projects, pass a JSON Schema object instead.

The `method` and `path` make this function callable over HTTP. Omit both and it runs only as a job — see [Building JavaScript functions](javascript-building-functions.md).

## Run it locally

```bash
uip function serve
```

This starts a hot-reload server on `http://localhost:7070`. Call the function:

```bash
curl -X POST http://localhost:7070/hello \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice"}'
# {"message":"Hello, Alice!"}
```

To reach Orchestrator from a local run, put `UIPATH_ACCESS_TOKEN`, `UIPATH_BASE_URL`, `UIPATH_ORG_ID` and `UIPATH_TENANT_ID` in a `.env` file at the project root. `serve` loads it on both supported runtimes.

## Next steps

- [Building JavaScript functions](javascript-building-functions.md) — contracts, errors, and the two function shapes.
- [HTTP triggers and routing](javascript-http-triggers.md) — routes, path parameters, and calling a deployed function.
- [Packaging and publishing](packaging-and-publishing.md) — deploy to Orchestrator.
- [CLI reference](https://uipath.github.io/uipath-typescript/js-functions/cli-reference/) — every command and flag.
