feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(auth): add RFC 8707 resource parameter to authorize and token requests - #10

Open
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main
Open

feat(auth): add RFC 8707 resource parameter to authorize and token requests#10
Zabari wants to merge 1 commit into
warpdotdev:mainfrom
Zabari:warp/oauth-resource-param-main

Conversation

@Zabari

Copy link
Copy Markdown

What

Forwards the AuthorizationManager's base_url (i.e. the MCP server URL) as the OAuth 2.0 resource parameter (RFC 8707, Resource Indicators for OAuth 2.0) on both:

  • the authorization URL produced by get_authorization_url
  • the token-exchange request issued by exchange_code_for_token

This is +13/-1 lines in crates/rmcp/src/transport/auth.rs, plus a small unit test.

Why

Some authorization servers, including Natoma (used for Atlassian's MCP server), require the resource parameter to audience-bind the issued access token. Without it, those servers reject the /authorize request with invalid_request and the browser-based login flow never renders for the user.

This change mirrors the upstream rust-sdk fix from modelcontextprotocol/rust-sdk#651 ("11-25-2025 compliant Auth"), where the same two add_extra_param("resource", ...) calls were threaded through both endpoints. The upstream PR is large because it bundles several other changes (PKCE method verification, SEP-835 scope handling, etc.); this PR is a minimal cherry-pick of just the RFC 8707 part.

Test plan

$ cargo test -p rmcp --features=auth --lib transport::auth
test result: ok. 23 passed; 0 failed

The new test authorize_url_includes_rfc8707_resource_parameter constructs an AuthorizationManager for https://mcp.example.com/v1/sse, calls get_authorization_url, and asserts that the resulting URL has resource=https%3A%2F%2Fmcp.example.com%2Fv1%2Fsse.

End-to-end, this unblocks the Atlassian MCP server OAuth flow in Warp once the pinned rmcp rev is bumped to include this commit.


Co-Authored-By: Oz oz-agent@warp.dev

…quests
Some authorization servers (e.g. Natoma, used for Atlassian's MCP server)
require the OAuth 2.0 `resource` parameter on /authorize and /token to
audience-bind the issued access token (RFC 8707, Resource Indicators for
OAuth 2.0). Without it they reject the authorization request with
`invalid_request` and the browser-based login flow never renders.
Forward the AuthorizationManager's `base_url` (the MCP server URL) as
the `resource` parameter on both:
* the authorization URL produced by `get_authorization_url`
* the token-exchange request issued by `exchange_code_for_token`
This mirrors the upstream rust-sdk fix (modelcontextprotocol/rust-sdk
modelcontextprotocol#651, '11-25-2025 compliant Auth') which threads the same parameter
through both call sites.
Adds a unit test asserting that `resource` is present in the generated
authorize URL and equals the manager's base URL.
`cargo test -p rmcp --features=auth --lib transport::auth` => 23 passed.
Co-Authored-By: Oz <oz-agent@warp.dev>
@Zabari

Copy link
Copy Markdown
Author

Tracking issue filed in warpdotdev/warp: warpdotdev/warp#9462

Pinging @oss-maintainers for review — this PR backports just the RFC 8707 resource parameter from upstream rust-sdk modelcontextprotocol#651, and unblocks Atlassian MCP OAuth login from Warp. Diff is +50/-3 with a new unit test; all 23 auth tests pass locally.

@vorporeal

Copy link
Copy Markdown

i'm working on migrating us to upstream rmcp, which should take care of this. :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Zabari@vorporeal