# Quickstart
URL: /docs/runtimes/a2a/quickstart
Minimal runtime and Thread setup against an A2A server.
Three steps to a working chat against an A2A server. Assumes you have already installed the package and have an A2A v1.0 server reachable; if not, start at [overview](/docs/runtimes/a2a).
### Wire up the runtime provider \[#wire-up-the-runtime-provider]
```tsx title="app/MyRuntimeProvider.tsx"
"use client";
import { AssistantRuntimeProvider } from "@assistant-ui/react";
import { useA2ARuntime } from "@assistant-ui/react-a2a";
export function MyRuntimeProvider({
children,
}: {
children: React.ReactNode;
}) {
const runtime = useA2ARuntime({
baseUrl: "http://localhost:9999",
});
return (
{children}
);
}
```
### Render the Thread \[#render-the-thread]
```tsx title="app/page.tsx"
import { Thread } from "@assistant-ui/react";
import { MyRuntimeProvider } from "./MyRuntimeProvider";
export default function Page() {
return (
);
}
```
### Set up UI components \[#set-up-ui-components]
Follow the [UI Components guide](/docs/ui/thread) to wire up the Thread, composer, and supporting primitives.
Once your A2A server is reachable, the runtime negotiates streaming vs non-streaming based on the agent card's `capabilities.streaming` flag and starts forwarding messages.
## Auth and headers \[#auth-and-headers]
Pass static or dynamic headers when your server expects auth:
```tsx
const runtime = useA2ARuntime({
baseUrl: "http://localhost:9999",
headers: async () => ({
Authorization: `Bearer ${await getAccessToken()}`,
}),
});
```
## Adding adapters \[#adding-adapters]
Attachments, speech, feedback, history, and a custom thread list are all supported via the standard adapter slots. See [adapters](/docs/runtimes/concepts/adapters) for the contracts; pass them on `useA2ARuntime`:
```tsx
const runtime = useA2ARuntime({
baseUrl: "http://localhost:9999",
adapters: { attachments, history, speech, feedback },
});
```
For multi-thread, see [threads](/docs/runtimes/concepts/threads) and pass `adapters.threadList`.
## Next \[#next]