How to

Claude Code on a Kiro subscription

Your company pays for Claude through AWS Kiro. Your engineers want Claude Code. A small proxy on each laptop lets them have both: the models stay the ones Kiro provides, and the tool is the one they asked for.

Short link: fredlackey.com/claude-code-on-kiro
Kiro Claude Code proxy AWS

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:

  1. Claude Code sends its request to the proxy on 127.0.0.1, exactly as it would to Anthropic.
  2. The proxy converts it to Kiro’s format and signs it with your existing Kiro sign-in, the one the Kiro CLI already uses.
  3. 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-provider with 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 /context is 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 used ANTHROPIC_API_KEY, which asks for approval once and is ignored if you declined. Use ANTHROPIC_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=1 in the same env block.
  • 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.

Need a hand?

Rolling this out to a team

Setting it up on one laptop is quick. Rolling it out to a team, with shared settings and the tooling people actually use, is where I can help.

Start a conversation