
Configuring Claude Cowork with Amazon Bedrock
A macOS walkthrough for configuring Claude Cowork on Amazon Bedrock (research preview) — full desktop Claude, inference inside your own AWS account.
If you want to use Claude but keep inference inside your own AWS account — for data governance, compliance, billing consolidation, regional control, or just to stay inside the security boundary your organization already trusts — Amazon Bedrock is the path. Until recently, that path only got you Claude Code: a powerful coding agent, but not the general-purpose desktop experience many users want. With the recent announcement of Claude Cowork on Amazon Bedrock , that's no longer the case.
This post walks through configuring Cowork against Bedrock on macOS, with the lessons I picked up along the way.
What is Claude Cowork
With Claude Cowork, your users can delegate research, document analysis, data processing, and report generation to Claude from a desktop application. They get the core Claude Desktop capabilities including projects, artifacts, memory, file upload and export, remote connectors, skills, plugins, and MCP servers. Features that require Anthropic-hosted inference, including the Chat tab, Computer Use, and the Skills Marketplace, are not included because Claude Cowork routes model inference exclusively through Amazon Bedrock in your AWS account. For a full feature comparison with Claude Enterprise, see Features on 3P.
Note: Cowork's third-party inference support is a preview feature. The configuration UI and file format will continue to evolve — keep an eye on the Cowork 3P configuration reference and the Claude on AWS product page .
How third-party config is meant to work
In a production rollout, third-party inference configuration is expected to be managed by an enterprise device-management tool (MDM) that pushes a signed configuration to each endpoint. That's the long-term model: admins define the Bedrock region, allowed models, MCP servers, and egress rules centrally, and users just launch the app.
During the preview, you can also enable Developer Mode in the desktop app to access the same configuration directly on your own machine. That's the path this post covers — how to set Cowork up yourself, today, on macOS.
Two config files to know about
Cowork on 3P uses two separate JSON config files on macOS, and it matters which one you edit depending on what you're configuring. Getting these straight up front saves a lot of head-scratching:
File | Path | Purpose |
|---|---|---|
3P managed config | ~/Library/Application Support/Claude-3p/configLibrary/<uuid>.json | Admin/enterprise configuration: inference provider, models, managed MCP servers, egress allow-lists, telemetry settings. In a production deployment, MDM pushes this file. In developer mode, you edit it yourself. |
Desktop user config | ~/Library/Application Support/Claude-3p/claude_desktop_config.json | User-scoped configuration, primarily the mcpServers block for local stdio MCPs you add for personal use (the same format Claude Desktop has always used). |
The 3P managed config file lives under a UUID filename, so it's worth symlinking to somewhere more memorable. Throughout this post, I'll refer to the symlinked path
~/.claude/cowork-3p-config.json :Bash
ln -s "/Users/you/Library/Application Support/Claude-3p/configLibrary/<uuid>.json" \~/.claude/cowork-3p-config.json
To find the
<uuid> filename, use the Reveal in Finder option inside the 3P config window — it takes you straight to the file.Quick rule of thumb:
- Adding a personal local MCP server? →
claude_desktop_config.json
- Adding an enterprise-managed MCP server with permission policy? → 3P managed config (
~/.claude/cowork-3p-config.json)
- Configuring inference, models, egress, telemetry? → 3P managed config
Warning: Always quit Cowork fully (Cmd+Q) before editing either file. The app may overwrite your changes on quit if it's still running.
Before you start
A few things to have ready:
- Bedrock access in the region you want to use. Global inference profiles (for example, the
global.anthropic.claude-*family) remove a lot of cross-region routing headaches.
- An authentication method for Bedrock. You can use a Bedrock API key (bearer token), or an AWS CLI profile. If you go the profile route, make sure it's configured locally and — if it's an SSO profile — that you're logged in (
aws sso login --profile <name>) before launching Cowork. The profile's role needs Bedrock invoke permissions on the models you plan to use.
- Awareness of what's available where. The Chat tab, Computer Use, and Skills Marketplace require Anthropic-hosted inference and aren't available with Bedrock. Cowork and Claude Code are both fully supported against Bedrock.
Install and configuration walkthrough
- Download and install the Claude desktop app.
- Launch the app but do not sign in. Signing in routes you down the Anthropic-hosted path; you want to configure Bedrock before anything else.
- Enable Developer Mode from Help → Troubleshooting.
- Open Developer → Configure third-party inference and fill in:
- Provider: Bedrock
- AWS region (a region that has the models you want;
us-east-1is a safe default)
- Authentication: either a Bedrock bearer token or an AWS CLI profile name. If you pick a profile, confirm it's configured locally and you're logged in (for SSO) before starting.
- Model list (see the next section — this is the trickiest part)
- Enable Skip deployment-mode chooser so Cowork doesn't prompt for cloud vs. 3P every launch.
- Allow egress in the sandbox settings. If your environment is not egress-restricted,
*is the simplest value. If it is, allow-list only what your MCP servers need.
- Configure MCP servers (covered in its own section below).
The model list
Model configuration lives in the 3P managed config (
~/.claude/cowork-3p-config.json ), under the top-level inferenceModels key. Cowork's 3P config UI exposes this field as a model list that, on the surface, looks like a simple array of strings — one Bedrock inference profile ID per line. For most models that's all you need:JSON
"inferenceModels": ["global.anthropic.claude-opus-4-7","global.anthropic.claude-sonnet-4-6","global.anthropic.claude-haiku-4-5-20251001-v1:0"]
The first entry in
inferenceModels becomes the default model selection in the picker, so order your list with your preferred default at the top.To get the exact model ID for an entry, go to the Amazon Bedrock console and look up the model. Remember that inference profiles are what you want here, not the raw model identifiers — check the "Inference profiles" section for the global and regional profile IDs.
A note on 1M-context models
Several Claude models support an extended 1M-token context window. Accessing that extended window requires an additional beta header on each request (
anthropic-beta: context-1m-2025-08-07 ). Some tools, including Claude Code, accept a [1m] suffix on the model name as a shorthand to flip that header on — for example, global.anthropic.claude-opus-4-7[1m] . That shorthand may appear to work in Cowork, but it's not the supported mechanism there and isn't guaranteed to inject the beta header correctly.Configuring a 1M-context model
Note: 1M context cannot be configured through the settings UI — the form only accepts strings, and the object entry Cowork needs is rejected. You'll need to edit the 3P managed config file by hand, and doing so currently disables the settings window. The steps below walk through the full workflow.
Cowork exposes 1M context through a
supports1m: true capability flag on the model entry — not via a suffix, and not via anything you can type into the settings form. Using Opus 4.7 as the example, the entry you want in inferenceModels is:JSON
{ "name": "global.anthropic.claude-opus-4-7", "supports1m": true }
When Cowork sees this, it adds a separate picker row for the 1M variant (alongside the standard one, which it still surfaces automatically) and injects the
anthropic-beta: context-1m-2025-08-07 header on requests for that variant. In the model picker you'll see something like "Opus 4.7" and "Opus 4.7 (1M)" as two separate choices.Two things to know before you add this entry:
-
supports1m: trueis a capability assertion. Cowork takes your word for it and doesn't verify with Bedrock. If you set it on a model whose deployment doesn't actually support 1M, the request will fail mid-session once the conversation crosses ~200K tokens.
- The model ID must match exactly what Cowork discovers from your provider. If the 1M variant doesn't appear in the picker, the most likely cause is a mismatch between the
nameyou set and the ID Cowork is using.
Why you can't add this through the settings form
The 3P config form treats every entry in the model list as a string. If you try to paste
{ "name": "...", "supports1m": true } into that field, the form wraps it in quotes and escapes the braces, producing something like "{ \"name\": ..., \"supports1m\": true }" that Cowork can't parse at runtime. The supported approach is to edit the 3P managed config file directly.Editing the file: step-by-step
Here's the end-to-end workflow to enable 1M context for Opus 4.7:
- Quit Cowork fully (Cmd+Q — not just close the window). The app may overwrite your changes on quit if it's still running.
- Locate the 3P managed config file. From the 3P config window, use the Reveal in Finder option — it takes you straight to the file. It lives under
~/Library/Application Support/Claude-3p/configLibrary/with a UUID filename. Once you've found it, symlinking it somewhere convenient saves a lot of hunting on future edits: __PRE_PLACEHOLDER_3__
- Open the file in your editor. For example: __PRE_PLACEHOLDER_4__
- Replace the Opus 4.7 string entry in
inferenceModelswith the object form. A fullinferenceModelsarray with Opus 4.7 configured for 1M looks like this: __PRE_PLACEHOLDER_5__ Note that you don't need to keep"global.anthropic.claude-opus-4-7"as a separate string entry — thesupports1m: trueobject entry gives you both the standard and 1M picker rows automatically.
- Save the file.
- Relaunch Cowork and confirm in the model picker that you see separate "Opus 4.7" and "Opus 4.7 (1M)" entries.
The 1M-entry side effect: a disabled settings window
One thing worth knowing up front: as of this writing, once you have an object entry in
inferenceModels , the 3P config window no longer opens — it goes blank because the form doesn't know how to render object-shaped entries. The underlying runtime parses the config fine, so Cowork itself works normally; only the settings UI is affected.If you need to get the config dialog back (to rotate a token, change a region, update MCP servers through the UI), temporarily remove the object entry from the file, open the UI, make your changes, then put the object entry back. A simple way to keep both states around:
Bash
cp ~/.claude/cowork-3p-config.json ~/.claude/cowork-3p-config.1m.backup.json
This will almost certainly smooth out as the feature matures; it's a rough edge of a preview release.
MCP server configuration
Cowork supports two distinct ways of wiring up MCP servers, each living in a different config file and with different lifecycle and permission semantics:
- User-added MCP servers — local stdio servers you add for yourself, defined in the
mcpServersblock of~/Library/Application Support/Claude-3p/claude_desktop_config.json. These are the ones you're most likely to bring over from Claude Code.
- Managed MCP servers — remote HTTPS servers declared under the top-level
managedMcpServerskey of the 3P managed config (~/.claude/cowork-3p-config.json). These are admin-provisioned and support per-tool permission locks viatoolPolicy, a capability that is not available for local stdio servers.
The two files coexist. Use the user config for personal local tools, and the managed config whenever you have a remote HTTPS MCP whose permissions you want to set explicitly rather than approve interactively.
User-added MCP servers
For personal tools — particularly the local stdio servers you likely already use with Claude Code — you'll add entries to
mcpServers in the Claude desktop user config file. The JSON format is nearly identical to Claude Code's mcpServers block. Using an Asana MCP server as the example:JSON
{"mcpServers": {"asana-local-mcp": {"type": "stdio","command": "asana-local-mcp","args": [],"env": {"PATH": "/Users/you/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"}}}}
Step-by-step:
- Quit Cowork fully (Cmd+Q).
- Open the user config file:
__PRE_PLACEHOLDER_8__
If the file doesn't exist, create it with an empty object
{}and start from there.
- Add (or extend) a
mcpServersblock at the top level of the JSON. Add one object per server you want to enable. Setcommandto the binary name or an absolute path (see MCP runtime considerations below for why the absolute path is sometimes required).
- Save and relaunch Cowork.
- Confirm the server registered by checking its tool list in a new Cowork conversation, or by looking at the MCP log.
Tools from user-added servers follow Cowork's default interactive approval flow (you approve each tool call on first use). There is no user-config mechanism to pre-approve or lock permissions on local stdio servers; if you need that, see the managed-server approach below. If you want to skip approvals entirely at the session level, the Bypass Permissions toggle turns off prompting for all MCP tool calls in a session — useful in developer mode but worth understanding before you leave it on.
Managed MCP servers (with toolPolicy)
Managed MCP servers are declared under the top-level
managedMcpServers key of the 3P managed config file ( ~/.claude/cowork-3p-config.json ). They must be reachable over HTTPS, and they support a toolPolicy field that lets you set per-tool defaults ( allow , ask , or blocked ). This is the only way in the current config schema to pin MCP permissions without interactive prompts.The AWS Knowledge MCP Server is a great example: it's a public HTTPS endpoint, requires no authentication, exposes a handful of read-only documentation tools, and is a natural fit for
"allow" defaults.Step-by-step:
- Quit Cowork fully (Cmd+Q).
- Get the exact tool names. MCP tool names often include server-specific prefixes that aren't obvious from the server's documentation. The AWS Knowledge MCP Server tools, for instance, are prefixed with
aws___— so the tool you'd think of assearch_documentationappears asaws___search_documentationin Cowork. Two reliable ways to discover the actual names:
- Option A: Register the server as a user-added entry first (in
claude_desktop_config.json, using the fastmcp bridge described in MCP runtime considerations for HTTP transport). Relaunch, connect, then open Settings → Connectors, find the server, and copy the tool names from its permission list. Once you have the list, remove the user-added entry and proceed with the managed form.
- Option B: Look up the server's tool schema from its documentation or
tools/listMCP response.
- Open the 3P managed config file: __PRE_PLACEHOLDER_9__
- Add
managedMcpServersas a top-level native JSON array, sibling toinferenceModelsand anymcpServersblock. Example with AWS Knowledge MCP: __PRE_PLACEHOLDER_10__ Notes:
-
transport: "http"is the default; included for clarity.
-
toolPolicyvalues:"allow"auto-approves,"ask"prompts,"blocked"rejects.
- If your MCP requires auth, use
oauth: true(for PKCE),headers(for static tokens), orheadersHelper(for short-lived tokens fetched via a local executable). See the 3P configuration reference for the full field list.
- Save the file.
- Relaunch Cowork.
- Verify in Settings → Connectors. The server should appear in the connector list with an admin-managed indicator. Opening its permission panel will show each tool locked to the policy you set.


One subtle benefit of this approach for the AWS Knowledge server specifically: it avoids the need for the
uvx fastmcp run <url> stdio-bridge workaround Cowork has required for HTTP transport elsewhere. Managed servers connect directly over HTTPS.Note: A config-file format note: the
managedMcpServers value is a native JSON array when editing the Cowork 3P managed config file directly. You may see the Cowork docs refer to "JSON array as a string" — that form applies only when delivering the configuration via a macOS .mobileconfig MDM plist, which requires array values to be string-encoded. Inside the JSON file, the native array form is what Cowork parses.MCP runtime considerations
A grab bag of things that tend to bite when moving MCP servers to Cowork, particularly the local stdio ones you may be bringing over from Claude Code. Everything below applies to the user-added servers in
claude_desktop_config.json ; managed servers connect over HTTPS and don't hit these issues.Cowork spawns MCP servers outside your shell
Claude Code launches MCP servers through your login shell, so they inherit your full
PATH , any mise / asdf / nvm activation, virtualenv setup, and the rest of your dotfile setup.Cowork does not. Cowork spawns each MCP server as a direct child process with a minimal, hardcoded
PATH — the same restriction that applies to any macOS GUI app launched from Finder. In practice that means:-
~/.zshrcis not sourced.
-
mise/asdf/pyenvshims outside the default path list are invisible.
- Tools installed to non-standard locations are not on the search path.
You'll see this surface as:
Plain text
Failed to spawn process: No such file or directory
…even for a command you can run fine in a terminal.
The fix: absolute paths or explicit env.PATH
Two patterns work. Pick whichever feels right for a given server.
Option 1: point
command at the absolute path to the binary:JSON
"my-mcp-server": {"type": "stdio","command": "/Users/you/bin/my-mcp-server","args": [],"env": {}}
Option 2: keep
command short but set env.PATH so the script can find the binaries it needs. This is the form you want when the MCP server itself shells out to other tools:JSON
"my-mcp-server": {"type": "stdio","command": "my-mcp-server","args": [],"env": {"PATH": "/Users/you/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"}}
A very common failure mode is an MCP server that launches successfully but then dies immediately with
exec: somecommand: not found in the log. That's always the inner command missing from PATH . Add the directory containing that tool to env.PATH on the server entry.The log file is your friend
Cowork writes detailed MCP logs. When a server refuses to start, the log tells you:
- The exact command and
PATHit used
- The initialization handshake (or lack thereof)
- Stderr output from the server process — including shebang errors, missing commands, and auth failures
Find the log path for your install (it's reachable from Developer tools) and keep it open in a second window while you're iterating.
HTTP / SSE remote MCP servers need a stdio proxy when added as user servers
Claude Code supports remote MCP servers configured as
"type": "http" directly in mcpServers . Cowork, as of this writing, does not — the mcpServers block in claude_desktop_config.json only understands stdio . If you drop an HTTP entry into mcpServers , Cowork silently ignores it, which is frustrating because the logs never mention it.Two ways around this:
- Preferred: move the server to
managedMcpServersin the 3P managed config. That block natively supports HTTP/SSE transport and gives youtoolPolicyfor free. See the managed servers section above.
- If you need a user-added workaround (for example, while you're still discovering the tool names before migrating to managed), proxy the HTTP server through a local stdio bridge. The AWS-recommended bridge is
fastmcp: __PRE_PLACEHOLDER_14__uvx fastmcp run <url>turns a remote HTTP endpoint into a local stdio process Cowork can talk to.
Best practices and lessons learned
A grab bag of things worth internalizing:
Know your two config files.
claude_desktop_config.json holds user-scoped MCP servers; the 3P managed config holds inference settings and admin-scoped MCPs with permission policy. Mismatching the file is the most common configuration mistake.Until enterprise management is in place, plan on editing the config files directly. In the long-term model, an MDM tool pushes a signed config to each endpoint and users never touch it. During the preview, and without that tooling, you'll be editing the underlying JSON files yourself for anything beyond what the settings UI exposes. Symlink the 3P config somewhere convenient and keep a backup of a known-good state.
Use global inference profiles. Names like
global.anthropic.claude-opus-4-7 handle cross-region routing automatically and spare you from tracking which Claude version is available in which region on a given day.Know which capabilities are Cowork-only vs. Anthropic-only. The Chat tab, Computer Use, and Skills Marketplace need Anthropic-hosted inference. Cowork and Claude Code both run happily on Bedrock.
Remember this is a preview. The configuration surface, the UI, and even file locations may change between releases. Don't over-invest in workarounds for today's rough edges — most will be smoothed out, and some of the advice in this post will age quickly.
References
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article