Files
Vincenzo Reina aca5f9c040 feat(python): Adapt OAuth to 2.1 version from new MCP spec (#518)
* feat: Add PRM in the metadata discovery

* fix: fallback anyway to PRM

* feat: Implement complete discovery logic

* feat: Final implementation of CIMD

* feat: Implement PKCE

* feat: Add scope from WWW-Authenticate

* feat: Add all URLs possible styles

* feat: Update tests and example

* docs: Update docs

* fix: linting

* docs: update API documentation

* fix: correct typos in OAuth metadata and error messages

- Updated the comment in ProtectedResourceMetadata to use the correct abbreviation (PRM).
- Fixed a typo in the OAuthAuthenticationError message regarding code challenge support.
- Corrected the comment for legacy client paths to use "pre-registered" instead of "pre-reggistered".

* feat: restructure authentication documentation and add new methods

- Updated the authentication section in  to group authentication methods under a new Authentication category with an icon.
- Removed the old  file and replaced it with new documentation files for Bearer Token, Custom Auth, and OAuth 2.1.
- Introduced an overview page for authentication methods, detailing usage and configuration for each method.
- Enhanced security best practices and examples for each authentication type to improve clarity and usability.

* refactor: improve debug logging for OAuth metadata discovery

- Updated debug messages to provide clearer context by specifying the issuer or host being queried during OAuth and OpenID Connect metadata discovery.
- Enhanced error logging to remove redundant information, focusing on the failure reason without repeating the URL.

* fix: correct abbreviation in ProtectedResourceMetadata documentation

- Updated the abbreviation from PRC to PRM in the ProtectedResourceMetadata section to ensure accuracy in the documentation.

* fix(oauth): correct RFC 8414 well-known URL construction for path-based issuers

  The OAuth metadata discovery was incorrectly constructing .well-known URLs
  by appending to the issuer instead of inserting between host and path.

  RFC 8414 specifies that for an issuer like https://github.com/login/oauth,
  the .well-known URL should be:
    https://github.com/.well-known/oauth-authorization-server/login/oauth

  We were incorrectly building:
    https://github.com/login/oauth/.well-known/oauth-authorization-server

  This fix:
  - Implements correct RFC 8414 URL construction (insert between host/path)
  - Supports OpenID Connect style as fallback (append to issuer)
  - Removes GitHub-specific hardcode since discovery now works correctly
  - Adds documentation comments explaining the two standards

  Ref: https://www.rfc-editor.org/rfc/rfc8414.html#section-3

* chore: oauth examples

* docs: enhance OAuth endpoint discovery documentation

- Updated the OAuth documentation to clarify how `mcp-use` discovers OAuth endpoints using both OAuth 2.0 and OpenID Connect standards.
- Added a table detailing the URL construction methods for each standard.
- Included examples for better understanding and a note on fallback behavior when the issuer has no path.

* response to bs codeql

* fix: update API URL Updated the GitHub API URL in the configuration to the correct endpoint for OAuth operations.

---------

Co-authored-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com>
Co-authored-by: pietrozullo <pietro.zullo@gmail.com>
2026-01-11 18:09:34 +01:00

162 lines
3.9 KiB
Plaintext

---
title: "Authentication Overview"
description: "mcp-use supports multiple authentication methods for MCP servers including OAuth 2.1, bearer tokens, and custom authentication."
icon: "key"
---
## Overview
MCP servers can require authentication to protect resources and control access. `mcp-use` handles authentication automatically based on your configuration.
```mermaid
flowchart LR
A["auth: string"] --> Bearer["Bearer Token"]
B["auth: { }"] --> OAuth["OAuth 2.1"]
C["auth: httpx.Auth"] --> Custom["Custom Auth"]
Bearer --> R["Authorization: Bearer token"]
OAuth --> R
Custom --> R
```
## Choose Your Method
<CardGroup cols={1}>
<Card title="Bearer Token" icon="ticket" href="/python/client/authentication/bearer">
**Simplest option**
Use a static API key or token. Best for services that issue long-lived credentials.
```python
"auth": "sk-your-api-key"
```
</Card>
<Card title="OAuth 2.1" icon="shield-check" href="/python/client/authentication/oauth">
**MCP standard**
Full OAuth flow with automatic discovery, PKCE, and token refresh. Required by many MCP servers.
```python
"auth": { "scope": "read write" }
```
</Card>
<Card title="Custom Auth" icon="wrench" href="/python/client/authentication/custom">
**Full control**
Use any `httpx.Auth` object for Basic, Digest, or custom authentication schemes.
```python
"auth": BasicAuth("user", "pass")
```
</Card>
</CardGroup>
## Quick Start Examples
<Tabs>
<Tab title="OAuth (Auto)">
For servers with OAuth support, just provide the URL:
```python
from mcp_use import MCPClient
config = {
"mcpServers": {
"linear": {
"url": "https://mcp.linear.app/sse"
# OAuth discovery + DCR happens automatically
}
}
}
client = MCPClient(config=config)
```
`mcp-use` will:
1. Discover the authorization server
2. Register a client (or use CIMD/pre-registered credentials)
3. Open your browser for authorization
4. Store and refresh tokens automatically
</Tab>
<Tab title="OAuth (Pre-registered)">
For servers requiring manual OAuth app registration:
```python
config = {
"mcpServers": {
"github": {
"url": "https://api.githubcopilot.com/mcp/",
"auth": {
"client_id": "your-github-client-id",
"client_secret": "your-github-client-secret",
"scope": "repo",
"callback_port": 8080
}
}
}
}
```
</Tab>
<Tab title="Bearer Token">
For API keys or static tokens:
```python
import os
config = {
"mcpServers": {
"api": {
"url": "https://api.example.com/mcp/sse",
"auth": os.getenv("API_KEY")
}
}
}
```
</Tab>
<Tab title="No Auth">
For public servers:
```python
config = {
"mcpServers": {
"public": {
"url": "https://public.example.com/mcp/sse"
}
}
}
```
</Tab>
</Tabs>
## Token Storage
Authentication tokens are stored securely on disk:
```
~/.mcp_use/tokens/
├── {server}.json # Access tokens
└── registrations/
└── {server}_registration.json # OAuth client credentials
```
<Warning>
Add `~/.mcp_use/` to your `.gitignore` to avoid committing credentials.
</Warning>
## Debugging
Enable verbose logging to troubleshoot authentication:
```python
from mcp_use import set_debug
set_debug(2) # Shows full OAuth flow, discovery, and token exchange
```
## Security Best Practices
- **Environment variables** - Never hardcode credentials in source code
- **Token rotation** - Rotate long-lived tokens regularly
- **Minimal scopes** - Request only the permissions you need
- **HTTPS only** - All OAuth endpoints use HTTPS (except localhost callbacks)