# Running it locally

The hosted server at `https://mcp.inittasks.com/mcp` serves everyone over HTTP. For development you can run the same tool surface locally over stdio, against your own account.

Local means one user, no OAuth, and a credential on your own machine. It is for building and debugging a client, not for anything other people use.

## Get a token

Sign in once and mint a key:

```bash
npm run mcp:login
npm run mcp:keygen
```

The key is written where the stdio server expects it. Treat it as you would the [personal access token](/authentication) it is: it carries your encryption key.

## Point a client at it

```json
{
  "mcpServers": {
    "init-tasks-local": {
      "command": "npm",
      "args": ["run", "mcp"]
    }
  }
}
```

The server speaks stdio, so the client starts the process and talks to it over the pipe. There is no port and no URL.

## Read-only while you experiment

The local server registers the write tools only when write access is on. Leave it off until you need it, and a mistake in a prompt cannot delete anything.

```bash
npm run mcp          # read-only
```

## What differs from the hosted server

| | local, stdio | hosted, HTTP |
|---|---|---|
| users | one, you | many |
| credential | a key on your machine | an OAuth grant |
| approval | none, you already signed in | nine-digit code in the app |
| audience binding | not applicable | `resource` is mandatory |
| tool list | the same | the same |

The tool list is the same on both, which is the point. A client that works against stdio works against the hosted server once it can do OAuth.

## Next

- [Building a client](/mcp/building)
- [The tools](/mcp)
