# Let your users connect Goose to your app

Get your app's MCP server ready for Goose, give your users a goose:// install link or the configure steps, and let Goose register itself.

This page is part of **Agent-ready apps**: it covers what you do so that your own users can connect Goose to the app you built with BuildBase. Your app serves MCP with @buildbase/sdk, and each user signs in on your hosted sign-in page and approves Goose as themselves.

> **Note:**
  Want to manage BuildBase itself from your AI? See [Use BuildBase in
  Goose](/console/ai-agents/goose), in **BuildBase in your AI tools**.

The examples use `https://app.example.com/api/mcp`, the default path `createAgentStack` serves, and the name `acme`.

## Before you share the URL

1. **Serve MCP over HTTPS** at a URL your users' machines can reach.
2. **Choose how Goose gets a client** in [Set up agent access](/sign-in-setup/agent-access). Goose tries a client ID metadata document or dynamic client registration by itself, so turn on **Let agents register themselves** with a base client, and **Let agents identify themselves by a metadata document** if you want that path too.
3. **Check it the way a client does:**

   ```bash
   npx buildbase agent doctor --url https://app.example.com/api/mcp
   ```

## What your users do

**One click.** Give your users a `goose://` link. Every value is URL-encoded:

```text
goose://extension?url=https%3A%2F%2Fapp.example.com%2Fapi%2Fmcp&type=streamable_http&id=acme&name=Acme&description=Acme%20for%20your%20account&timeout=300
```

**By hand**, with the steps for your help page:

1. Run `goose configure`, choose **Add Extension**, then **Remote Extension (Streamable HTTP)**.
2. Enter `acme` and `https://app.example.com/api/mcp`.
3. In Goose Desktop instead: **Settings** > **Extensions** > **Add custom extension**, with the Streamable HTTP type.

Goose then opens your sign-in page in the browser.

## What your users see

- **Your sign-in page and consent screen**, naming the client as it registered itself (or as its metadata document names it).
- **A malware scan** of the extension before Goose turns it on.
- **Your tools' annotations.** Mark read tools `readOnlyHint: true` and changes `destructiveHint` as they are, so a client can treat them differently.

When Goose connects, your user approves it on your consent screen. Here it is for an agent that registered itself:

![Your app's consent screen for an agent that registered itself, here Notes Helper: a warning that the app gave itself its name and nobody has checked it, what it may do as the person, the permissions it asked for by name, and Allow access and Deny ringed](/images/sign-in-setup/agent-access/hosted-consent-self-registered.webp)

## If something goes wrong

| What your user sees                         | Why                                                     | What to do                                                 |
| ------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------- |
| The install link does nothing               | A value in the link is not URL-encoded                  | Encode every parameter, the URL most of all                |
| Registration fails before your sign-in page | Neither self-registration nor metadata documents is on  | Turn one on in [agent access](/sign-in-setup/agent-access) |
| The sign-in fails at the redirect           | Your user's machine has the callback port in use        | They set `GOOSE_OAUTH_CALLBACK_PORT` to a free port        |
| Long calls time out                         | The extension's timeout is shorter than your tool takes | Raise `timeout` in the link, or tell users to raise it     |

## Related

- [Connect an agent to your app](/agents/connect-an-agent): every client on one page, the MCP Registry, and agents in code.
- [Let your users connect Cline to your app](/agents/clients/cline) and [Let your users connect Gemini CLI to your app](/agents/clients/gemini-cli).
- [Use BuildBase in Goose](/console/ai-agents/goose): the same client in **BuildBase in your AI tools**.
- Goose's own guide: [using extensions](https://goose-docs.ai/docs/getting-started/using-extensions).

## Frequently asked questions

### How does Goose get a client on my app?

Goose tries a client ID metadata document or dynamic client registration on its own, or takes a client_id you give it. Turn on Let agents register themselves, or metadata documents, and it needs nothing from you per user.

### Can I give my users a one-click install?

Yes. Goose takes a goose://extension link with your URL, the streamable_http type, an id, a name, a description and a timeout, each URL-encoded.

### Does Goose scan my server?

Goose's docs say extensions are scanned for malware before they are turned on. Your server is called normally after that.
