The situation
A lot of companies now approve AI models only through AWS. For coding, that usually means Kiro, AWS’s agentic IDE and CLI, licensed per seat through the company’s AWS account. Kiro’s lineup includes Anthropic’s Claude models, the same family Claude Code is built around.
Engineers who already work in Claude Code don’t want to give up its plugins, hooks, skills, subagents and editor integrations. The trick is to keep the models coming from Kiro and change only the tool in front of them. I’ve set this up for engineering teams several times. The way I used to do it stopped working, so here are both: the old technique, and the one that works now.
How it works
Claude Code can talk to any server that speaks Anthropic’s Messages API. You point it somewhere else with one setting, ANTHROPIC_BASE_URL. Kiro doesn’t speak that API, so a small proxy runs on the laptop and translates in both directions:
- Claude Code sends its request to the proxy on
127.0.0.1, exactly as it would to Anthropic. - The proxy converts it to Kiro’s format and signs it with your existing Kiro sign-in, the one the Kiro CLI already uses.
- Kiro runs the Claude model and streams the answer back. The proxy converts it, and Claude Code never knows the difference.
Two credentials are involved, and it helps to keep them straight. Your Kiro sign-in is what actually pays for the model calls. A proxy key that you make up yourself only stops anything else on the machine from using your proxy.
The old technique: kiro-gateway
The tool I used to use was kiro-gateway, a Python proxy. You cloned it, created a virtual environment, installed its requirements, put a password in its .env file, and ran it on port 8000. Claude Code pointed at http://localhost:8000 and sent the same password. It worked well.
It doesn’t anymore. The project is no longer maintained, newer versions of Claude Code send messages it rejects, and Kiro has since moved the service it was calling. If a team set it up from an older guide, that’s why it suddenly broke. Its defaults also listened on every network interface rather than only the laptop itself, which is worth knowing if anyone still has it running.
The new technique: kirocc
kirocc does the same job and is actively kept up with both Kiro and Claude Code. It’s a single Go binary, it listens only on the laptop by default, and it reads your Kiro sign-in without changing it. It also carries over more of Claude Code than the old proxy did: prompt caching, model discovery, effort levels and the 1M-token context window.
One thing to check first: Kiro limits which tools a subscription can be used with, so confirm with whoever manages your company’s Kiro subscription before you set this up.
1. Sign in to the Kiro CLI
Install the Kiro CLI if it isn’t already on the machine, then sign in the way your company does, usually “Your organization” and IAM Identity Center:
kiro-cli login
kiro-cli whoami
kirocc uses this sign-in. Use your company sign-in, not a personal one, so the usage lands on the company’s subscription.
2. Install Claude Code
Follow Anthropic’s install instructions, or use npm:
npm install -g @anthropic-ai/claude-code
You don’t need to sign in to an Anthropic account. If Claude Code is already signed in to one, the settings in step 5 take over.
3. Install kirocc
brew install d-kuro/tap/kirocc
Without Homebrew, and with Go installed:
go install github.com/d-kuro/kirocc/cmd/kirocc@latest
4. Start the proxy with a key
Make up a proxy key once and keep it somewhere safe, such as your password manager. This prints a good one:
openssl rand -hex 32
Then start kirocc with it:
kirocc -api-key "your-proxy-key"
It listens on http://127.0.0.1:3456. Check it from another terminal:
curl http://127.0.0.1:3456/health
If every request fails with an upstream error, your sign-in was recorded in a region where Kiro has no service. Pin the region Kiro uses:
kirocc -api-key "your-proxy-key" -kiro-api-region us-east-1
5. Point Claude Code at it
Put the settings in your user settings file, ~/.claude/settings.json, so every session picks them up. Use the same key you gave kirocc:
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:3456",
"ANTHROPIC_AUTH_TOKEN": "your-proxy-key",
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1"
}
}
Put them in your user settings, not a project’s .claude/settings.json, and never commit the key. If you’d rather try it in one terminal first, export the same three variables and run claude.
6. Pick a model
Start claude and run /model. Kiro’s models appear under “From gateway”. For the 1M-token context window, pick an entry marked “(1M context)”. Claude Code decides the window from the model name, so a plain entry gets the smaller one. You can also choose on the command line:
claude --model 'claude-opus-5-5[1m]'
7. Check it end to end
claude -p "Reply with the word pong"
Then, inside a session, run /status. It should show the proxy address as the Anthropic base URL and your key as an auth token.
8. Keep it running
kirocc has to be running whenever Claude Code is. A spare terminal tab or a tmux session is fine to start with. Once it’s part of the day, run it as a login service on the machine. If Kiro ever asks you to sign in again, run kiro-cli login and restart kirocc.
What’s different from Claude Code on Anthropic
- Web search. Kiro has no web search, so Claude Code’s WebSearch tool is refused unless you give kirocc a search provider (
-web-search-providerwith Brave, Tavily, Exa or your own). Or turn the tool off:claude --disallowedTools WebSearch. Fetching a specific URL still works. - Token counts are estimates. The proxy approximates them, so
/contextis close but not exact. - Usage shows up in Kiro, not Anthropic. Model calls draw down Kiro credits. Watch them, because long agent sessions on the larger models use them quickly.
- Account-only features are off. Anything that needs a claude.ai account, such as Remote Control and cloud sessions, isn’t available with a proxy.
- Everything else works. Plugins, skills, hooks, subagents, MCP servers,
CLAUDE.md, checkpoints, plan mode, headless mode and the VS Code and JetBrains extensions all run as usual.
On a build server
A CI runner can’t do an interactive Kiro sign-in. Kiro offers API keys for that on its paid plans. On company subscriptions an administrator has to allow them first. With a key, kirocc doesn’t need the Kiro CLI at all:
export KIRO_API_KEY="ksk_..."
kirocc -api-key "your-proxy-key"
When it doesn’t work
- Claude Code still asks you to sign in. The settings are in a project file instead of
~/.claude/settings.json, or you usedANTHROPIC_API_KEY, which asks for approval once and is ignored if you declined. UseANTHROPIC_AUTH_TOKEN. - “profileArn is required”. You’re signed in with a personal Builder ID. Sign in with your organization instead.
- Every request fails upstream. Pin the region with
-kiro-api-region us-east-1. - Requests fail after a Claude Code update. Update kirocc too. If a new beta feature is being rejected, set
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1in the sameenvblock. - The model list is stale. Claude Code caches it. Restart Claude Code after upgrading kirocc.
Why bother
Kiro is a capable tool, and for spec-driven work, with its requirements, design and task documents, it’s very good. The reason to put Claude Code in front of the same models is everything around them: a plugin system teams use to share their tooling, hooks that can block or rewrite what the agent does, fine-grained permission rules, an SDK for building on top of it, official GitHub and GitLab integrations, and extensions for the editors people already use. Same models, same subscription, and the tool your engineers want.