- OAuth (simplest): Add the extension with only the server URL. When Goose first connects to the extension, a browser window opens for you to sign in to Unstructured. This is a one-time sign-in. Goose stores the tokens in your system keychain and refreshes them automatically, so later sessions connect without the browser.
- API key: Send an Unstructured API key as a bearer token in a request header. Use this for headless or CI runs of the Goose CLI, where a browser sign-in is not practical.
Requirements
Before you begin, you must have the following:- Goose Desktop or the Goose CLI installed on your local development machine, with a model provider configured. Install Goose.
- An Unstructured account for the OAuth sign-in, or an Unstructured API key for bearer-token authentication. Get an API key.
Install the Transform MCP server
Goose Desktop
- Start Goose Desktop.
- Click the panel button in the top-left corner to open the sidebar, and then click Extensions.
- Under Extensions, click Add custom extension.
-
In the Add custom extension dialog, enter the following details:
- For Extension Name, enter
Unstructured Transform. - For Type, select
Streamable HTTP. - (Optional) For Description, enter a short description, such as
Turn documents into LLM-ready Markdown. - For Endpoint, enter
https://mcp.transform.unstructured.io. - For Timeout, enter
300. Transforms take from about 10 seconds to several minutes, and this sets how long Goose waits for a tool call to complete. - Leave Request Headers empty to use OAuth. To use an API key instead, enter a header name of
Authorizationand a value ofBearer <your-unstructured-api-key>, and then click the plus button to add the header.
- For Extension Name, enter
- Click Add Extension.
- Start a new chat. If you left the request headers empty, a browser window opens when Goose connects to the extension: sign in to Unstructured to finish connecting.
Goose CLI
The CLI shares its configuration file with Goose Desktop, so an extension added in one appears in the other. You may need to complete the OAuth sign-in once per interface.- In your terminal, run
goose configure. On a brand-new install,goose configurewalks you through model provider setup first; rerun it afterward to reach the extensions menu. - Select Add Extension, and then select Remote Extension (Streamable HTTP).
- For the extension name, enter
unstructured-transform. - For the URI, enter
https://mcp.transform.unstructured.io. - For the timeout, enter
300. - For the description, enter a short description or accept the default.
- When asked about custom headers:
- For OAuth, answer no.
- For API key authentication, answer yes and add a header named
Authorizationwith the valueBearer <your-unstructured-api-key>.
~/.config/goose/config.yaml directly. The following entry uses API key authentication with the
key substituted from an environment variable at connection time, which keeps the key out of the file:
The
env_keys entry is required. Goose substitutes ${UNSTRUCTURED_API_KEY} in header values only from keys it
resolves through env_keys, which reads the environment variable of the Goose process. The Goose Desktop app does
not inherit variables you export in a terminal, so for Goose Desktop either use OAuth or put the literal key in the
header value.Parse your source files
Parsing requests have the following limits:- Each file must be of a supported file type.
- Each file must be 50 MB or less in size.
- Each request must have 10 files or fewer.
- Only 5 requests can be running at a time.
Authorization header. The example
prompt reminds Goose of this; if an upload fails with an authorization error, tell Goose to retry the request
without that header.
Troubleshooting
- No OAuth window appears. The browser sign-in triggers when Goose connects to the extension, which happens at
the start of a session. Start a new chat (or a new
goose session), then complete the sign-in. 401 Unauthorizedor aninvalid_tokenerror. If you configured anAuthorizationheader, confirm the value is formatted asBearer <your-unstructured-api-key>. For the${UNSTRUCTURED_API_KEY}form, confirm the config entry also lists the variable underenv_keysand that the variable is exported in the shell running the Goose CLI.- The extension fails to connect in Goose Desktop but works in the CLI. This usually means the header references an environment variable that the desktop app does not inherit. Use OAuth or the literal key in Goose Desktop.
- macOS keeps asking to allow Goose to access the keychain. Goose stores the OAuth tokens in a keychain item that it reads at every session start, and macOS approves keychain access per binary. Click Always Allow for each Goose binary (the Desktop app and the CLI are separate). A Homebrew upgrade replaces the CLI binary and resets the approval, so expect one new prompt after upgrading.
404when connecting. Verify the endpoint is exactlyhttps://mcp.transform.unstructured.io, with no path appended.goose runpanics with anindex out of boundsorno rows returnederror. A Homebrew-installed CLI and Goose Desktop at different versions can collide on the shared session database. Update the two to matching versions, or isolate the CLI by settingXDG_DATA_HOMEto a separate directory before running.- The OAuth window signs you in to an unexpected server. If you have more than one Transform-style extension configured, the sign-in can belong to a different extension. Disable the others before the first sign-in.
- The tools stop before a long transform finishes. Raise the extension’s
timeoutvalue.300seconds covers most documents.
Next steps
- Control Transform file parsing output: Control how the Unstructured Transform MCP server instructs Transform to partition, enrich, chunk, and embed the data based on your files.
- Control Transform generated sample code: Control how the Unstructured Transform MCP server generates sample curl or Python code that demonstrates how to use Transform to partition, enrich, chunk, and embed the data based on your files.
Questions? Need help?
- For technical support, request support.

