> ## Documentation Index¶
> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt¶
> Use this file to discover all available pages before exploring further.¶
¶
# Claude Code on Microsoft Foundry¶
¶
> Learn about configuring Claude Code through Microsoft Foundry, including setup, configuration, and troubleshooting.¶
¶
export const ContactSalesCard = ({surface}) => {¶
const utm = content => `utm_source=claude_code&utm_medium=docs&utm_content=${surface}_${content}`;¶
const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">¶
<line x1="5" y1="12" x2="19" y2="12" />¶
<polyline points="12 5 19 12 12 19" />¶
</svg>;¶
const STYLES = `¶
.cc-cs {¶
--cs-slate: #141413;¶
--cs-clay: #d97757;¶
--cs-clay-deep: #c6613f;¶
--cs-gray-000: #ffffff;¶
--cs-gray-700: #3d3d3a;¶
--cs-border-default: rgba(31, 30, 29, 0.15);¶
font-family: inherit;¶
}¶
.dark .cc-cs {¶
--cs-slate: #f0eee6;¶
--cs-gray-000: #262624;¶
--cs-gray-700: #bfbdb4;¶
--cs-border-default: rgba(240, 238, 230, 0.14);¶
}¶
.cc-cs-card {¶
display: flex; align-items: center; justify-content: space-between;¶
gap: 16px; padding: 14px 16px; margin: 0;¶
background: var(--cs-gray-000); border: 0.5px solid var(--cs-border-default);¶
border-radius: 8px; flex-wrap: wrap;¶
}¶
.cc-cs-text { font-size: 13px; color: var(--cs-gray-700); line-height: 1.5; flex: 1; min-width: 240px; }¶
.cc-cs-text strong { font-weight: 550; color: var(--cs-slate); }¶
.cc-cs-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }¶
.cc-cs-btn-clay {¶
display: inline-flex; align-items: center; gap: 8px;¶
background: var(--cs-clay-deep); color: #fff; border: none;¶
border-radius: 8px; padding: 8px 14px;¶
font-size: 13px; font-weight: 500;¶
transition: background-color 0.15s; white-space: nowrap;¶
}¶
.cc-cs-btn-clay:hover { background: var(--cs-clay); }¶
.cc-cs-btn-ghost {¶
display: inline-flex; align-items: center; gap: 8px;¶
background: transparent; color: var(--cs-gray-700);¶
border: 0.5px solid var(--cs-border-default);¶
border-radius: 8px; padding: 8px 14px;¶
font-size: 13px; font-weight: 500;¶
}¶
.cc-cs-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }¶
.dark .cc-cs-btn-ghost:hover { background: rgba(255, 255, 255, 0.04); }¶
@media (max-width: 720px) {¶
.cc-cs-actions { width: 100%; }¶
}¶
`;¶
return <div className="cc-cs not-prose">¶
<style>{STYLES}</style>¶
<div className="cc-cs-card">¶
<div className="cc-cs-text">¶
<strong>Deploying Claude Code across your organization?</strong> Talk to sales about enterprise plans, SSO, and centralized billing.¶
</div>¶
<div className="cc-cs-actions">¶
<a href={`https://claude.com/pricing?${utm('view_plans')}#plans-business`} className="cc-cs-btn-ghost">¶
View plans¶
</a>¶
<a href={`https://www.anthropic.com/contact-sales?${utm('contact_sales')}`} className="cc-cs-btn-clay">¶
Contact sales {iconArrowRight()}¶
</a>¶
</div>¶
</div>¶
</div>;¶
};¶
¶
export const Experiment = ({flag, treatment, children}) => {¶
const VID_KEY = 'exp_vid';¶
const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);¶
const fnv1a = s => {¶
let h = 0x811c9dc5;¶
for (let i = 0; i < s.length; i++) {¶
h ^= s.charCodeAt(i);¶
h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);¶
}¶
return h >>> 0;¶
};¶
const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';¶
const [decision] = useState(() => {¶
const params = new URLSearchParams(location.search);¶
const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];¶
const force = params.get('gb-force');¶
if (force) {¶
for (const p of force.split(',')) {¶
const [k, v] = p.split(':');¶
if (k === flag) return {¶
variant: v || 'treatment',¶
track: false¶
};¶
}¶
}¶
if (navigator.globalPrivacyControl) {¶
return {¶
variant: 'control',¶
track: false¶
};¶
}¶
const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);¶
if (prefsMatch) {¶
try {¶
if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {¶
return {¶
variant: 'control',¶
track: false¶
};¶
}¶
} catch {¶
return {¶
variant: 'control',¶
track: false¶
};¶
}¶
} else {¶
const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];¶
if (!country || CONSENT_COUNTRIES.has(country)) {¶
return {¶
variant: 'control',¶
track: false¶
};¶
}¶
}¶
let vid;¶
try {¶
const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);¶
if (ajsMatch) {¶
vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');¶
} else {¶
vid = localStorage.getItem(VID_KEY);¶
if (!vid) {¶
vid = crypto.randomUUID();¶
}¶
document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;¶
}¶
try {¶
localStorage.setItem(VID_KEY, vid);¶
} catch {}¶
} catch {¶
return {¶
variant: 'control',¶
track: false¶
};¶
}¶
const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);¶
return {¶
variant,¶
track: true,¶
vid¶
};¶
});¶
useEffect(() => {¶
if (!decision.track) return;¶
fetch('https://api.anthropic.com/api/event_logging/v2/batch', {¶
method: 'POST',¶
headers: {¶
'Content-Type': 'application/json',¶
'x-service-name': 'claude_code_docs'¶
},¶
body: JSON.stringify({¶
events: [{¶
event_type: 'GrowthbookExperimentEvent',¶
event_data: {¶
device_id: decision.vid,¶
anonymous_id: decision.vid,¶
timestamp: new Date().toISOString(),¶
experiment_id: flag,¶
variation_id: decision.variant === 'treatment' ? 1 : 0,¶
environment: 'production'¶
}¶
}]¶
}),¶
keepalive: true¶
}).catch(() => {});¶
}, []);¶
return decision.variant === 'treatment' ? treatment : children;¶
};¶
¶
<Experiment flag="docs-contact-sales-cta" treatment={<ContactSalesCard surface="foundry" />} />¶
¶
## Prerequisites¶
¶
Before configuring Claude Code with Microsoft Foundry, ensure you have:¶
¶
* An Azure subscription with access to Microsoft Foundry¶
* RBAC permissions to create Microsoft Foundry resources and deployments¶
* Azure CLI installed and configured (optional - only needed if you don't have another mechanism for getting credentials)¶
¶
<Note>¶
If you are deploying Claude Code to multiple users, [pin your model versions](#4-pin-model-versions) to prevent breakage when Anthropic releases new models.¶
</Note>¶
¶
## Setup¶
¶
### 1. Provision Microsoft Foundry resource¶
¶
First, create a Claude resource in Azure:¶
¶
1. Navigate to the [Microsoft Foundry portal](https://ai.azure.com/)¶
2. Create a new resource, noting your resource name¶
3. Create deployments for the Claude models:¶
* Claude Opus¶
* Claude Sonnet¶
* Claude Haiku¶
¶
### 2. Configure Azure credentials¶
¶
Claude Code supports two authentication methods for Microsoft Foundry. Choose the method that best fits your security requirements.¶
¶
**Option A: API key authentication**¶
¶
1. Navigate to your resource in the Microsoft Foundry portal¶
2. Go to the **Endpoints and keys** section¶
3. Copy **API Key**¶
4. Set the environment variable:¶
¶
```bash theme={null}¶
export ANTHROPIC_FOUNDRY_API_KEY=your-azure-api-key¶
```¶
¶
**Option B: Microsoft Entra ID authentication**¶
¶
When `ANTHROPIC_FOUNDRY_API_KEY` is not set, Claude Code automatically uses the Azure SDK [default credential chain](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains#defaultazurecredential-overview).¶
This supports a variety of methods for authenticating local and remote workloads.¶
¶
On local environments, you commonly may use the Azure CLI:¶
¶
```bash theme={null}¶
az login¶
```¶
¶
<Note>¶
When using Microsoft Foundry, the `/login` and `/logout` commands are disabled since authentication is handled through Azure credentials.¶
</Note>¶
¶
### 3. Configure Claude Code¶
¶
Set the following environment variables to enable Microsoft Foundry:¶
¶
```bash theme={null}¶
# Enable Microsoft Foundry integration¶
export CLAUDE_CODE_USE_FOUNDRY=1¶
¶
# Azure resource name (replace {resource} with your resource name)¶
export ANTHROPIC_FOUNDRY_RESOURCE={resource}¶
# Or provide the full base URL:¶
# export ANTHROPIC_FOUNDRY_BASE_URL=https://{resource}.services.ai.azure.com/anthropic¶
```¶
¶
### 4. Pin model versions¶
¶
<Warning>¶
Pin specific model versions for every deployment. If you use model aliases (`sonnet`, `opus`, `haiku`) without pinning, Claude Code may attempt to use a newer model version that isn't available in your Foundry account, breaking existing users when Anthropic releases updates. When you create Azure deployments, select a specific model version rather than "auto-update to latest."¶
</Warning>¶
¶
Set the model variables to match the deployment names you created in step 1.¶
¶
Without `ANTHROPIC_DEFAULT_OPUS_MODEL`, the `opus` alias on Foundry resolves to Opus 4.6. Set it to the Opus 4.7 ID to use the latest model:¶
¶
```bash theme={null}¶
export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-67'¶
export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-6'¶
export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5'¶
```¶
¶
For current and legacy model IDs, see [Models overview](https://platform.claude.com/docs/en/about-claude/models/overview). See [Model configuration](/en/model-config#pin-models-for-third-party-deployments) for the full list of environment variables.¶
¶
## Azure RBAC configuration¶
¶
The `Azure AI User` and `Cognitive Services User` default roles include all required permissions for invoking Claude models.¶
¶
For more restrictive permissions, create a custom role with the following:¶
¶
```json theme={null}¶
{¶
"permissions": [¶
{¶
"dataActions": [¶
"Microsoft.CognitiveServices/accounts/providers/*"¶
]¶
}¶
]¶
}¶
```¶
¶
For details, see [Microsoft Foundry RBAC documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/rbac-azure-ai-foundry).¶
¶
## Troubleshooting¶
¶
If you receive an error "Failed to get token from azureADTokenProvider: ChainedTokenCredential authentication failed":¶
¶
* Configure Entra ID on the environment, or set `ANTHROPIC_FOUNDRY_API_KEY`.¶
¶
## Additional resources¶
¶
* [Microsoft Foundry documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/what-is-azure-ai-foundry)¶
* [Microsoft Foundry models](https://ai.azure.com/explore/models)¶
* [Microsoft Foundry pricing](https://azure.microsoft.com/en-us/pricing/details/ai-foundry/)¶