Skip to content

Commit fc0f3a6

Browse files
authored
Merge branch 'main' into patch-1
2 parents 730d4aa + 8d07c35 commit fc0f3a6

49 files changed

Lines changed: 7908 additions & 747 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- uses: actions/checkout@v4
1414
- uses: actions/setup-node@v4
1515
with:
16-
node-version: 20
16+
node-version: 24
1717
cache: npm
1818

1919
- run: npm ci

.github/workflows/markdown-format.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Setup Node.js
2020
uses: actions/setup-node@v4
2121
with:
22-
node-version: '20'
22+
node-version: '24'
2323

2424
- name: Install dependencies
2525
run: npm ci

.github/workflows/render-seps.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: Render SEPs
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- "seps/**/*.md"
9+
- "scripts/render-seps.ts"
10+
11+
pull_request:
12+
paths:
13+
- "seps/**/*.md"
14+
- "scripts/render-seps.ts"
15+
16+
# Allow manual trigger
17+
workflow_dispatch:
18+
19+
permissions:
20+
contents: write
21+
22+
jobs:
23+
render-seps:
24+
runs-on: ubuntu-latest
25+
26+
steps:
27+
- uses: actions/checkout@v4
28+
29+
- uses: actions/setup-node@v4
30+
with:
31+
node-version: 24
32+
cache: npm
33+
34+
- run: npm ci
35+
36+
- name: Render SEPs
37+
run: npm run generate:seps
38+
39+
- name: Check for changes
40+
id: changes
41+
run: |
42+
if [[ -n "$(git status --porcelain docs/community/seps/ docs/snippets/badge.mdx docs/docs.json)" ]]; then
43+
echo "has_changes=true" >> $GITHUB_OUTPUT
44+
else
45+
echo "has_changes=false" >> $GITHUB_OUTPUT
46+
fi
47+
48+
# On push to main, commit any changes
49+
- name: Commit changes
50+
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.changes.outputs.has_changes == 'true'
51+
run: |
52+
git config --local user.email "github-actions[bot]@users.noreply.github.com"
53+
git config --local user.name "github-actions[bot]"
54+
git add docs/community/seps/ docs/snippets/badge.mdx docs/docs.json
55+
git commit -m "docs: auto-render SEPs documentation"
56+
git push
57+
58+
# On PR, verify docs are up to date
59+
- name: Verify SEPs are up to date
60+
if: github.event_name == 'pull_request'
61+
run: npm run check:seps

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v20.18.1
1+
v24.2.0

blog/content/posts/2025-11-25-first-mcp-anniversary.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ Tasks are launching as an **experimental capability**, meaning that it's part of
161161

162162
One of the top painpoints from the community when it comes to authorization has been [Dynamic Client Registration](https://www.rfc-editor.org/rfc/rfc7591), or DCR. This capability is needed because in the MCP world there is an unbounded number of clients and servers, so doing standard client pre-registration is not always feasible. You wouldn't expect every MCP client in the world to also have a client registration with every Authorization Server (AS) out there, so DCR was used as a solution to this problem. You can learn more about the current approach in our [authorization guide](https://modelcontextprotocol.io/docs/tutorials/security/authorization).
163163

164-
To use DCR, however, a MCP server developer would need to rely on an AS that allows clients to register themselves via a public API. If the AS doesn't support this capability, developers would now need to build an OAuth proxy that would be manually registered with the AS, and support Dynamic Client Registration itself, mapping its own issued tokens to tokens issued from the downstream AS. This is a complex, time-consuming, and error-prone task, and doesn't actually solve the fundamental problems with Dynamic Client Registration.
164+
To use DCR, however, an MCP server developer would need to rely on an AS that allows clients to register themselves via a public API. If the AS doesn't support this capability, developers would now need to build an OAuth proxy that would be manually registered with the AS, and support Dynamic Client Registration itself, mapping its own issued tokens to tokens issued from the downstream AS. This is a complex, time-consuming, and error-prone task, and doesn't actually solve the fundamental problems with Dynamic Client Registration.
165165

166-
The alternative would be for every customer or end user to provide _their own_ client registration, but that's just trading one complex task for another. In that model, when a user connects to a MCP server, they need to go through their IT team to create a registration, assign it the right permissions, and then configure the MCP client to use it.
166+
The alternative would be for every customer or end user to provide _their own_ client registration, but that's just trading one complex task for another. In that model, when a user connects to an MCP server, they need to go through their IT team to create a registration, assign it the right permissions, and then configure the MCP client to use it.
167167

168168
**[SEP-991](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1296)** introduced a much more elegant solution to the problem - URL-based client registration using [OAuth Client ID Metadata Documents](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-client-id-metadata-document-00) (you might've already seen our [blog post on this change from earlier this year](https://blog.modelcontextprotocol.io/posts/client_registration/)). Clients can now provide their own client ID that is a URL pointing to a JSON document the client manages that describes properties of the client.
169169

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
title: "SEP-1046: Support OAuth client credentials flow in authorization"
3+
sidebarTitle: "SEP-1046: Support OAuth client credentials flow i…"
4+
description: "Support OAuth client credentials flow in authorization"
5+
---
6+
7+
import { Badge } from "/snippets/badge.mdx";
8+
9+
<div className="flex items-center gap-2 mb-4">
10+
<Badge color="green">Final</Badge>
11+
<Badge color="gray">Standards Track</Badge>
12+
</div>
13+
14+
| Field | Value |
15+
| ------------- | ------------------------------------------------------------------------ |
16+
| **SEP** | 1046 |
17+
| **Title** | Support OAuth client credentials flow in authorization |
18+
| **Status** | Final |
19+
| **Type** | Standards Track |
20+
| **Created** | 2025-07-23 |
21+
| **Author(s)** | Darin McAdams ([@D-McAdams](https://github.com/D-McAdams) ) |
22+
| **Sponsor** | None |
23+
| **PR** | [#1046](https://github.com/modelcontextprotocol/specification/pull/1046) |
24+
25+
---
26+
27+
## Abstract
28+
29+
Recommends adding the OAuth client credentials flow to the authorization spec to enable machine-to-machine scenarios.
30+
31+
### Motivation
32+
33+
The original authorization spec mentioned the client credentials flow, but it was dropped in subsequent revisions. Therefore, the spec is currently silent on how to solve machine-to-machine scenarios where an end-user is unavailable for interactive authorization.
34+
35+
### Specification
36+
37+
The authorization spec would be amended to list the OAuth client credentials flow as being allowed. Adhering to the patterns established by OAuth 2.1, the specification would RECOMMEND the use of asymmetric methods defined in RFC 753 (JWT Assertions), but also allow client secrets.
38+
39+
As guidance to implementors, the spec overview would also be updated to describe the different flows and when each is applicable. In addition, to address a common question, the spec would be updated to indicate that implementors may implement other authorization scenarios beyond what's defined; emphasizing that the specification defines the baseline requirements.
40+
41+
### Rationale
42+
43+
To maximize interoperability (and minimize SDK complexity), this change would intentionally constrain the client credentials flow to two options:
44+
45+
1. JWT Assertions as per RFC 7523 (RECOMMENDED)
46+
2. Client Secrets via HTTP Basic authentication (Allowed for maximum compatibility with existing systems)
47+
48+
Other options, such as mTLS, are not included.
49+
50+
While the spec encourages the use of RFC 7523 (JWT Assertions), it does not yet specify how to populate the JWT contents nor how to discover the client's JWKS URI to validate the JWT. In future iterations of the spec, it will be beneficial to do so. However, this was currently left unspecified pending maturity of other RFCs that can define these profiles. The other RFCs include [WIMSE Headless JWT Authentication](https://www.ietf.org/archive/id/draft-levy-wimse-headless-jwt-authentication-01.html) (for specifying JWT contents) and [Client ID Metadata](https://datatracker.ietf.org/doc/draft-parecki-oauth-client-id-metadata-document/) (for specifying the JWKS URI). This revision intentionally leaves extensibility for these future profiles. As a practical matter, this means implementers needing to ship solutions ASAP will most likely use client secrets which are widely supported today, whereas the JWT Assertion pattern represents the longer-term direction.
51+
52+
### Backward Compatibility
53+
54+
This change is fully backward compatible. It introduces a new authorization flow, but does not alter the existing flows.
55+
56+
### Security Implications
57+
58+
The specification refers to the existing OAuth security guidance.

0 commit comments

Comments
 (0)