<!-- Agent Datasets docs · Quickstart · canonical: https://www.agentdatasets.com/docs/quickstart · rendered from https://www.agentdatasets.com -->

# Quickstart

Ten minutes from nothing to an agent that can answer a question with sourced, structured data. You need an API key and an MCP client; everything else is one config block.

## Get an API key

Sign in to the [dashboard](/dashboard) and create a key under [API keys](/dashboard/keys). The secret is shown **once**, at creation — copy it then. If you lose it, rotate the key: rotation issues a new secret under the same prefix, so you update one config value rather than re-registering the server.

Keys created in the dashboard are public-surface keys, which is what you want for anything an agent runs. [Authentication](/docs/authentication) explains what that means for the data you get back.

## Claude Code

One command registers the hosted server for the current project. Add `--scope user` to register it for every project instead.

## Claude Desktop

Desktop's config file only launches local servers, so the hosted endpoint is reached through the `mcp-remote` stdio bridge — which needs Node.js on your machine. Paste this into `claude_desktop_config.json` (Settings → Developer → Edit Config) and restart Desktop.

## Cursor

Goes in `~/.cursor/mcp.json` for every project, or `.cursor/mcp.json` for one.

## Make the first call

Restart the client, and the tools appear namespaced by category. Two calls worth making first — one to see what is here, one to get a real value back:

```python
platform_get_catalog(limit=50)
```

The catalog answers "what data does this server hold" in one bounded page: every category with its launch status, every dataset with coverage, cadence, licensing posture, freshness, and the tools that serve it. It is the routing table an agent should read before guessing at a tool name.

Then something concrete:

```python
fx_get_rates(quote="USD", limit=5)
```

That returns the five most recent euro reference rates for USD, newest first.

## Read the envelope

Every tool on every surface answers in the same three-part envelope, so an agent learns the shape once. The response below is a **shape**, with illustrative values:

```json
{
  "data": {
    "base": "EUR",
    "quote": "USD",
    "unit": "USD per EUR",
    "currency": "USD",
    "rates": [
      {
        "date": "2026-08-19",
        "value": "1.093400",
        "as_of": "2026-08-19T16:00:00Z",
        "derived": false
      }
    ]
  },
  "meta": {
    "source": "ecb",
    "as_of": "2026-08-19T16:00:00Z",
    "attribution": "...",
    "derived_method": null
  },
  "pagination": {
    "limit": 5,
    "has_more": true,
    "next_cursor": "eyJ2IjoxLCJrIjpbLi4uXX0"
  }
}
```

Three things to notice, because they hold for every tool:

- **Numbers are strings.** `"1.093400"` is an exact decimal, deliberately not a float. Parse it with a decimal type; do not let it become a binary float on the way into your reasoning.
- **Values describe themselves.** `unit`, `currency`, `as_of`, and the source attribution travel with the answer, so a number can never be quoted without its meaning.
- **Results are bounded.** `pagination.has_more` tells you whether more matched; `pagination.next_cursor` is the token you pass back as `cursor` to continue. Nothing dumps an unbounded result into your context.

## Where to go next

- [Authentication](/docs/authentication) — how keys, headers, and the public surface work.
- [Category guides](/docs/guides/fx) — what each advertised category holds and the workflows that get answers out of it.
- [Errors and the envelope](/docs/errors) — the envelope in full, and every error code an agent can provoke.
- [REST quickstart](/docs/rest-quickstart) — the same data over plain HTTP, for the parts of your stack that are not agents.
