oauth2-mcp 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f085908d39436f4a8552bd99340d6048ee7397cc4fbc5e42a0581e30b9db6293
4
- data.tar.gz: c6d0073dbf2cb02073fd1f9895752083c5811b9a080e648ff34a23bb72a873da
3
+ metadata.gz: 9081c4f81e43038eb6d8d05df66e33efcdfc88823aa05f43696a4b60554c0ada
4
+ data.tar.gz: 88e3823dd00208e5081f8dc40e31aa0bcc34c75e03f8505d1cab12d5c0e369f0
5
5
  SHA512:
6
- metadata.gz: 27c17a9a23c70a08b4a770633546f9447b1321ea9a96051d6f6b9bd6ae97bb8a86fbc0a38ecdd128131d1cf1e052f07a6506354dd864d249a6f67ebd870c94f5
7
- data.tar.gz: 168a19002a3952f5f658f4c7bce722efb6ba74da3e65bf62fdc69b12cb714b8b4a4fc16d7ed5039a500b7c8780544148b0aff0f7cf36f821bb06537da9eb8a4a
6
+ metadata.gz: ae9d905301d29dee55608baf1ee803b4b2edfcd242fff7998861fc327afc7cb4cd09eb5cb39efdf8794dc7aca54087910330516eda2e16b7b0f52fa02fe638dd
7
+ data.tar.gz: 14e288b5816c8a8d7a7101493781d0fddec2b2b0c74508a513b54b692b2aefee190eecbed508a7b80ac29ea76d7c15415542cb0c9cd59ea371c7df1aa2f0cf8f
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,56 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.1.2] - 2026-07-14
34
+
35
+ - TAG: [v0.1.2][0.1.2t]
36
+ - COVERAGE: 100.00% -- 285/285 lines in 2 files
37
+ - BRANCH COVERAGE: 100.00% -- 82/82 branches in 2 files
38
+ - 67.05% documented
39
+
40
+ ### Added
41
+
42
+ - Added support for JRuby 10.1 and TruffleRuby 34.0.
43
+
44
+ ### Changed
45
+
46
+ - Retemplated generated project metadata, support documentation, CI workflows,
47
+ binstubs, and development dependency floors with `kettle-jem` v7.0.0.
48
+
49
+ ### Fixed
50
+
51
+ - Corrected RubyGems homepage metadata to point at the gem documentation site.
52
+ - Corrected persisted Open Collective metadata to use the `ruby-oauth`
53
+ collective.
54
+
55
+ - Package configured license files in gem release file lists.
56
+
57
+ ## [0.1.1] - 2026-06-15
58
+
59
+ - TAG: [v0.1.1][0.1.1t]
60
+ - COVERAGE: 100.00% -- 285/285 lines in 2 files
61
+ - BRANCH COVERAGE: 100.00% -- 82/82 branches in 2 files
62
+ - 67.05% documented
63
+
64
+ ### Changed
65
+
66
+ - Refreshed generated package metadata, support documentation, CI workflows,
67
+ `version_gem` >= 1.1.12, `appraisal2` >= 3.1.2, `nomono` >= 1.0.4, and
68
+ development dependency floors from the current kettle-jem template.
69
+ - Updated generated OpenCollective funding metadata to use the
70
+ `ruby-oauth` collective.
71
+ - Raised the runtime dependency floor for `oauth2` to `>= 2.0.23`.
72
+ - Updated the locked `auth-sanitizer` runtime dependency to v0.2.1.
73
+ - Updated the locked `snaky_hash` runtime dependency to v2.0.5.
74
+ - Updated generated documentation dependency metadata to require
75
+ `yaml-converter` >= 0.2.1.
76
+
77
+ ### Fixed
78
+
79
+ - Restored `docs/CNAME` so the generated documentation site keeps its custom domain.
80
+ - Fixed generated documentation URLs that incorrectly pointed at a monorepo
81
+ `gems/oauth2-mcp` path.
82
+
33
83
  ## [0.1.0] - 2026-05-28
34
84
 
35
85
  - TAG: [v0.1.0][0.1.0t]
@@ -43,6 +93,10 @@ Please file a bug if you notice a violation of semantic versioning.
43
93
  - Treated unsupported OAuth introspection response shapes as inactive tokens
44
94
  instead of allowing low-level indexing errors to escape.
45
95
 
46
- [Unreleased]: https://github.com/ruby-oauth/oauth2-mcp/compare/v0.1.0...HEAD
96
+ [Unreleased]: https://github.com/ruby-oauth/oauth2-mcp/compare/v0.1.2...HEAD
97
+ [0.1.2]: https://github.com/ruby-oauth/oauth2-mcp/compare/v0.1.1...v0.1.2
98
+ [0.1.2t]: https://github.com/ruby-oauth/oauth2-mcp/releases/tag/v0.1.2
99
+ [0.1.1]: https://github.com/ruby-oauth/oauth2-mcp/compare/v0.1.0...v0.1.1
100
+ [0.1.1t]: https://github.com/ruby-oauth/oauth2-mcp/releases/tag/v0.1.1
47
101
  [0.1.0]: https://github.com/ruby-oauth/oauth2-mcp/compare/03b55e60f4a464acdaa9ebd4e29556579055f102...v0.1.0
48
102
  [0.1.0t]: https://github.com/ruby-oauth/oauth2-mcp/releases/tag/v0.1.0
data/CITATION.cff CHANGED
@@ -12,9 +12,9 @@ authors:
12
12
  orcid: 'https://orcid.org/0009-0008-8519-441X'
13
13
  identifiers:
14
14
  - type: url
15
- value: 'https://github.com/ruby-oauth/oauth2-mcp/tree/main/gems/oauth2-mcp'
15
+ value: 'https://github.com/ruby-oauth/oauth2-mcp'
16
16
  description: "oauth2-mcp"
17
- repository-code: 'https://github.com/ruby-oauth/oauth2-mcp/tree/main/gems/oauth2-mcp'
17
+ repository-code: 'https://github.com/ruby-oauth/oauth2-mcp'
18
18
  abstract: >-
19
19
  oauth2-mcp
20
20
  license: See license file
data/CONTRIBUTING.md CHANGED
@@ -102,22 +102,41 @@ Git hooks and commit message helpers (exe/kettle-commit-msg)
102
102
  - GIT_HOOK_FOOTER_SENTINEL: Required when footer append is enabled — a unique first-line sentinel to prevent duplicates
103
103
  - GIT_HOOK_FOOTER_APPEND_DEBUG: Extra debug output in the footer template (true/false)
104
104
 
105
+ Git diff driver setup
106
+ - Local setup writes repository `.gitattributes` entries and local Git `diff.smorg-*` command config so this checkout uses StructuredMerge semantic diffs.
107
+ - Global setup registers `diff.smorg-*` commands once in the user Git config; use it when you work across several StructuredMerge-enabled repositories.
108
+ - Include-file setup writes `.git/smorg/config` and includes it from local Git config, keeping command registrations out of the repository files.
109
+ - Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local `git diff` uses semantic drivers.
110
+
111
+ ```console
112
+ K_JEM_TEMPLATING=true kettle-jem install
113
+ ```
114
+
115
+ Troubleshooting Git diffs
116
+ - Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
117
+ - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
118
+ - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`.
119
+ - To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
120
+
105
121
  For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
106
122
 
107
123
  ## Appraisals
108
124
 
109
125
  From time to time the [appraisal2][🚎appraisal2] gemfiles in `gemfiles/` will need to be updated.
110
126
  Generated appraisal and CI workflow floors are controlled by `ruby.test_minimum`
111
- in `.kettle-jem.yml`; this project was templated with `ruby.test_minimum: 3.2.0`.
127
+ in `.structuredmerge/kettle-jem.yml`; this project was templated with `ruby.test_minimum: 3.2.0`.
112
128
  That value describes the lowest Ruby version expected to run the test/development
113
129
  toolchain, and it may be higher than the gemspec runtime floor.
114
130
 
115
131
  They are created and updated with the commands:
116
132
 
117
133
  ```console
118
- bin/rake appraisal:update
134
+ bin/rake appraisal:generate
119
135
  ```
120
136
 
137
+ Use `bin/rake appraisal:update` when you intentionally need to resolve fresh
138
+ appraisal locks.
139
+
121
140
  If you need to reset all gemfiles/*.gemfile.lock files:
122
141
 
123
142
  ```console
@@ -233,9 +252,9 @@ NOTE: To build without signing the gem set `SKIP_GEM_SIGNING` to any value in th
233
252
  14. Run `bundle exec rake release` which will create a git tag for the version,
234
253
  push git commits and tags, and push the `.gem` file to the gem host configured in the gemspec.
235
254
 
236
- [📜src-gl]: https://gitlab.com/ruby-oauth/oauth2-mcp/-/tree/main/gems/oauth2-mcp
237
- [📜src-cb]: https://codeberg.org/ruby-oauth/oauth2-mcp/src/branch/main/gems/oauth2-mcp
238
- [📜src-gh]: https://github.com/ruby-oauth/oauth2-mcp/tree/main/gems/oauth2-mcp
255
+ [📜src-gl]: https://gitlab.com/ruby-oauth/oauth2-mcp
256
+ [📜src-cb]: https://codeberg.org/ruby-oauth/oauth2-mcp
257
+ [📜src-gh]: https://github.com/ruby-oauth/oauth2-mcp
239
258
  [🧪build]: https://github.com/ruby-oauth/oauth2-mcp/actions
240
259
  [🤝conduct]: https://github.com/ruby-oauth/oauth2-mcp/blob/main/CODE_OF_CONDUCT.md
241
260
  [🖐contrib-rocks]: https://contrib.rocks
data/FUNDING.md CHANGED
@@ -4,20 +4,20 @@ Official Discord 👉️ [![Live Chat on Discord][✉️discord-invite-img]][✉
4
4
 
5
5
  Many paths lead to being a sponsor or a backer of this project. Are you on such a path?
6
6
 
7
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
7
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
8
 
9
- [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
10
10
 
11
11
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
12
12
  [⛳liberapay]: https://liberapay.com/pboling/donate
13
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
14
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
15
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
16
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
13
17
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
14
18
  [🖇sponsor]: https://github.com/sponsors/pboling
15
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
16
- [🖇polar]: https://polar.sh/pboling
17
19
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
18
20
  [🖇kofi]: https://ko-fi.com/pboling
19
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
20
- [🖇patreon]: https://patreon.com/galtzo
21
21
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
22
22
  [🖇buyme]: https://www.buymeacoffee.com/pboling
23
23
  [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
@@ -42,7 +42,7 @@ To join the community or get help 👇️ Join the Discord.
42
42
 
43
43
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
44
44
 
45
- [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
45
+ [![Sponsor ruby-oauth/oauth2-mcp on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
46
46
 
47
47
  # Another Way to Support Open Source Software
48
48
 
@@ -55,6 +55,13 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
55
55
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
56
56
 
57
57
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
58
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
59
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
60
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
61
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
62
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
63
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
64
+ [🖇osc]: https://opencollective.com/ruby-oauth
58
65
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
59
66
  [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
60
67
  [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
data/LICENSE.md CHANGED
@@ -7,4 +7,4 @@ Choose the option that best fits your use case:
7
7
 
8
8
  ## Copyright Notice
9
9
 
10
- Copyright (c) 2026 Peter H. Boling
10
+ - Copyright (c) 2026 Peter H. Boling
data/MIT.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ See [LICENSE.md](LICENSE.md) for the copyright notice.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,32 +1,25 @@
1
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-floss-i]][🖼️galtzo-floss] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![ruby-oauth Logo by Chris Messina, CC BY-SA 3.0][🖼️oauth-i]][🖼️oauth]
1
+ <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" align="right"/></a> <a href="https://github.com/ruby-oauth"><img alt="ruby-oauth Logo by Chris Messina, CC BY-SA 3.0" src="https://logos.galtzo.com/assets/images/oauth/avatar-128px.svg" align="right"/></a>
2
2
 
3
- [🖼️galtzo-floss-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
- [🖼️galtzo-floss]: https://discord.gg/3qme4XHNKN
5
- [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
- [🖼️ruby-lang]: https://www.ruby-lang.org/
7
- [🖼️oauth-i]: https://logos.galtzo.com/assets/images/oauth/avatar-192px.svg
8
- [🖼️oauth]: https://github.com/ruby-oauth
3
+ # 🍲 OAuth2::MCP
9
4
 
10
- # 🔮 OAuth2::MCP
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
11
6
 
12
- [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
13
-
14
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-floss], as I may have missed the [discord notification][🖼️galtzo-floss].
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
15
8
 
16
9
  ---
17
10
 
18
11
  `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
19
12
 
20
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
21
14
 
22
- <details>
15
+ <details markdown="1">
23
16
  <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
24
17
 
25
18
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
26
19
 
27
20
  </details>
28
21
 
29
- ## 🌻 Synopsis
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
30
23
 
31
24
  `oauth2-mcp` is a Ruby resource-server toolkit for securing HTTP Model Context
32
25
  Protocol servers with OAuth 2.1-style bearer authorization.
@@ -52,9 +45,9 @@ claims and mapped capabilities, not the raw bearer token.
52
45
 
53
46
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
54
47
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
55
- | Works with JRuby | [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
56
- | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
57
- | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
48
+ | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
49
+ | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
50
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
58
51
  | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
59
52
  | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
60
53
  | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
@@ -72,11 +65,25 @@ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
72
65
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
73
66
  not practical for the current toolchain.
74
67
 
75
- | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
76
- |------------------------------------------------|--------------------------------------------------------|
77
- | 👟 Check it out! | [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
68
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
69
+
70
+ The _amazing_ test matrix is powered by the kettle-dev stack.
78
71
 
72
+ <details markdown="1">
73
+ <summary>How kettle-dev manages complexity in tests</summary>
74
+
75
+ | Gem | Source | Role | Daily download rank |
76
+ |-----|--------|------|---------------------|
77
+ | [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |
78
+ | [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |
79
+ | [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |
80
+ | [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |
81
+ | [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |
82
+ | [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |
83
+ | [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |
84
+ | [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |
79
85
 
86
+ </details>
80
87
 
81
88
  ### Federated DVCS
82
89
 
@@ -144,7 +151,7 @@ issuer(s), and the scopes your endpoint understands:
144
151
  metadata = OAuth2::MCP::ProtectedResourceMetadata.new(
145
152
  resource: "https://brain.example.com/mcp",
146
153
  authorization_servers: ["https://example.authkit.app"],
147
- scopes_supported: %w[memory.read memory.write],
154
+ scopes_supported: %w[memory.read memory.write]
148
155
  )
149
156
  ```
150
157
 
@@ -164,8 +171,8 @@ server needs internal permission names:
164
171
  scope_mapper = OAuth2::MCP::ScopeMapper.new(
165
172
  mapping: {
166
173
  "memory.read" => "documents_read",
167
- "memory.write" => "documents_write",
168
- },
174
+ "memory.write" => "documents_write"
175
+ }
169
176
  )
170
177
  ```
171
178
 
@@ -178,7 +185,7 @@ resource_server = OAuth2::MCP::ResourceServer.new(
178
185
  resource_metadata: metadata,
179
186
  resource_metadata_url: "https://brain.example.com/.well-known/oauth-protected-resource/mcp",
180
187
  validator: validator,
181
- scope_mapper: scope_mapper,
188
+ scope_mapper: scope_mapper
182
189
  )
183
190
  ```
184
191
 
@@ -190,7 +197,7 @@ Build protected-resource metadata for an MCP endpoint:
190
197
  metadata = OAuth2::MCP::ProtectedResourceMetadata.new(
191
198
  resource: "https://brain.example.com/mcp",
192
199
  authorization_servers: ["https://example.authkit.app"],
193
- scopes_supported: %w[memory.read memory.write],
200
+ scopes_supported: %w[memory.read memory.write]
194
201
  )
195
202
 
196
203
  metadata.to_json
@@ -203,7 +210,7 @@ challenge = OAuth2::MCP::BearerChallenge.new(
203
210
  resource_metadata: "https://brain.example.com/.well-known/oauth-protected-resource/mcp",
204
211
  scope: %w[memory.read],
205
212
  error: "insufficient_scope",
206
- error_description: "memory.read is required",
213
+ error_description: "memory.read is required"
207
214
  )
208
215
 
209
216
  headers["WWW-Authenticate"] = challenge.to_header
@@ -215,32 +222,32 @@ Authorize an MCP HTTP request with a provider-specific token validator:
215
222
  metadata = OAuth2::MCP::ProtectedResourceMetadata.new(
216
223
  resource: "https://brain.example.com/mcp",
217
224
  authorization_servers: ["https://example.authkit.app"],
218
- scopes_supported: %w[memory.read memory.write],
225
+ scopes_supported: %w[memory.read memory.write]
219
226
  )
220
227
 
221
228
  validator = OAuth2::MCP::JWTValidator.new(
222
229
  jwks: {"keys" => provider_jwks},
223
230
  issuer: "https://example.authkit.app",
224
- audience: "https://brain.example.com/mcp",
231
+ audience: "https://brain.example.com/mcp"
225
232
  )
226
233
 
227
234
  scope_mapper = OAuth2::MCP::ScopeMapper.new(
228
235
  mapping: {
229
236
  "memory.read" => "documents_read",
230
- "memory.write" => "documents_write",
231
- },
237
+ "memory.write" => "documents_write"
238
+ }
232
239
  )
233
240
 
234
241
  resource_server = OAuth2::MCP::ResourceServer.new(
235
242
  resource_metadata: metadata,
236
243
  resource_metadata_url: "https://brain.example.com/.well-known/oauth-protected-resource/mcp",
237
244
  validator: validator,
238
- scope_mapper: scope_mapper,
245
+ scope_mapper: scope_mapper
239
246
  )
240
247
 
241
248
  result = resource_server.authorize(
242
249
  request: rack_env,
243
- scopes: ["memory.read"],
250
+ scopes: ["memory.read"]
244
251
  )
245
252
 
246
253
  halt result.status, result.headers, "" unless result.allowed?
@@ -258,9 +265,9 @@ Or build the validator from OIDC discovery:
258
265
 
259
266
  ```ruby
260
267
  validator = OAuth2::MCP::OIDCDiscovery.new(
261
- issuer: "https://example.authkit.app",
268
+ issuer: "https://example.authkit.app"
262
269
  ).jwt_validator(
263
- audience: "https://brain.example.com/mcp",
270
+ audience: "https://brain.example.com/mcp"
264
271
  )
265
272
  ```
266
273
 
@@ -270,7 +277,7 @@ issuer and `/oauth2/jwks` endpoint:
270
277
  ```ruby
271
278
  validator = OAuth2::MCP::WorkOSAuthKit.new(
272
279
  subdomain: "acme",
273
- audience: "https://brain.example.com/mcp",
280
+ audience: "https://brain.example.com/mcp"
274
281
  )
275
282
  ```
276
283
 
@@ -282,7 +289,7 @@ validator = OAuth2::MCP::IntrospectionValidator.new(
282
289
  client: oauth_client,
283
290
  introspection_url: "https://auth.example.com/oauth2/introspection",
284
291
  audience: "https://brain.example.com/mcp",
285
- issuer: "https://auth.example.com",
292
+ issuer: "https://auth.example.com"
286
293
  )
287
294
  ```
288
295
 
@@ -293,7 +300,7 @@ Raising a monthly budget of... "dollars" would make the project more sustainable
293
300
 
294
301
  We welcome both individual and corporate sponsors! We also offer a
295
302
  wide array of funding channels to account for your preferences.
296
- Currently, [GitHub Sponsors][🖇sponsor], and [Liberapay][⛳liberapay] are our preferred funding platforms.
303
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
297
304
 
298
305
  **If you're working in a company that's making significant use of ruby-oauth tools we'd
299
306
  appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
@@ -302,12 +309,38 @@ You can support the development of ruby-oauth tools via
302
309
  [GitHub Sponsors][🖇sponsor],
303
310
  [Liberapay][⛳liberapay],
304
311
  [PayPal][🖇paypal],
312
+ [Open Collective][🖇osc]
305
313
  and [Tidelift][🏙️entsup-tidelift].
306
314
 
307
315
  | 📍 NOTE |
308
316
  |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
309
317
  | If doing a sponsorship in the form of donation is problematic for your company <br/> from an accounting standpoint, we'd recommend the use of Tidelift, <br/> where you can get a support-like subscription instead. |
310
318
 
319
+ ### Open Collective for Individuals
320
+
321
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
322
+
323
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
324
+
325
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
326
+ No backers yet. Be the first!
327
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
328
+
329
+ ### Open Collective for Organizations
330
+
331
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]
332
+
333
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
334
+
335
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
336
+ No sponsors yet. Be the first!
337
+
338
+ ### Open Collective for Donors
339
+
340
+ [Bill Woika](https://opencollective.com/bill-woika) [Philipp Ebneter](https://opencollective.com/guest-e77282f7) [Grigoriy](https://opencollective.com/guest-c93e0c48)
341
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
342
+
343
+ [kettle-readme-backers]: https://github.com/ruby-oauth/oauth2-mcp/blob/main/bin/kettle-readme-backers
311
344
 
312
345
  ### Another way to support open-source
313
346
 
@@ -319,7 +352,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
319
352
 
320
353
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
321
354
 
322
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
355
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
323
356
 
324
357
  ## 🔐 Security
325
358
 
@@ -365,7 +398,7 @@ Made with [contributors-img][🖐contrib-rocks].
365
398
 
366
399
  Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/oauth2-mcp/-/graphs/main][🚎contributors-gl]
367
400
 
368
- <details>
401
+ <details markdown="1">
369
402
  <summary>⭐️ Star History</summary>
370
403
 
371
404
  <a href="https://star-history.com/ruby-oauth/oauth2-mcp&Date">
@@ -435,24 +468,33 @@ To join the community or get help 👇️ Join the Discord.
435
468
 
436
469
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
437
470
 
438
- [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
471
+ [![Sponsor ruby-oauth/oauth2-mcp on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
439
472
 
440
473
  ### Please give the project a star ⭐ ♥.
441
474
 
475
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
476
+
442
477
  Thanks for RTFM. ☺️
443
478
 
444
479
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
445
480
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
446
481
  [⛳liberapay]: https://liberapay.com/pboling/donate
482
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
483
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
484
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
485
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
486
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
487
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
488
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
489
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
490
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
491
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
492
+ [🖇osc]: https://opencollective.com/ruby-oauth
447
493
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
448
494
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
449
495
  [🖇sponsor]: https://github.com/sponsors/pboling
450
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
451
- [🖇polar]: https://polar.sh/pboling
452
496
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
453
497
  [🖇kofi]: https://ko-fi.com/pboling
454
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
455
- [🖇patreon]: https://patreon.com/galtzo
456
498
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
457
499
  [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
458
500
  [🖇buyme]: https://www.buymeacoffee.com/pboling
@@ -467,7 +509,7 @@ Thanks for RTFM. ☺️
467
509
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
468
510
 
469
511
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
470
- [⛳️gem-namespace]: https://github.com/ruby-oauth/oauth2-mcp/tree/main/gems/oauth2-mcp
512
+ [⛳️gem-namespace]: https://github.com/ruby-oauth/oauth2-mcp
471
513
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-OAuth2::MCP-3C2D2D.svg?style=square&logo=ruby&logoColor=white
472
514
  [⛳️gem-name]: https://bestgems.org/gems/oauth2-mcp
473
515
  [⛳️name-img]: https://img.shields.io/badge/name-oauth2--mcp-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
@@ -507,11 +549,11 @@ Thanks for RTFM. ☺️
507
549
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
508
550
  [🚂railsbling]: http://www.railsbling.com
509
551
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
510
- [📜src-gl]: https://gitlab.com/ruby-oauth/oauth2-mcp/-/tree/main/gems/oauth2-mcp
552
+ [📜src-gl]: https://gitlab.com/ruby-oauth/oauth2-mcp
511
553
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
512
- [📜src-cb]: https://codeberg.org/ruby-oauth/oauth2-mcp/src/branch/main/gems/oauth2-mcp
554
+ [📜src-cb]: https://codeberg.org/ruby-oauth/oauth2-mcp
513
555
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
514
- [📜src-gh]: https://github.com/ruby-oauth/oauth2-mcp/tree/main/gems/oauth2-mcp
556
+ [📜src-gh]: https://github.com/ruby-oauth/oauth2-mcp
515
557
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
516
558
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
517
559
  [📜gl-wiki]: https://gitlab.com/ruby-oauth/oauth2-mcp/-/wikis/home
@@ -530,13 +572,13 @@ Thanks for RTFM. ☺️
530
572
  [🏀codecovi]: https://codecov.io/gh/ruby-oauth/oauth2-mcp/graph/badge.svg
531
573
  [🏀coveralls]: https://coveralls.io/github/ruby-oauth/oauth2-mcp?branch=main
532
574
  [🏀coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/oauth2-mcp/badge.svg?branch=main
533
- [🖐codeQL]: https://github.com/ruby-oauth/oauth2-mcp/security/code-scanning
534
- [🖐codeQL-img]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/codeql-analysis.yml/badge.svg
535
575
  [🚎ruby-3.2-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/ruby-3.2.yml
536
576
  [🚎ruby-3.3-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/ruby-3.3.yml
537
577
  [🚎ruby-3.4-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/ruby-3.4.yml
578
+ [🚎jruby-10.0-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/jruby-10.0.yml
538
579
  [🚎truby-24.2-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/truffleruby-24.2.yml
539
580
  [🚎truby-25.0-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/truffleruby-25.0.yml
581
+ [🚎truby-33.0-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/truffleruby-33.0.yml
540
582
  [🚎2-cov-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/coverage.yml
541
583
  [🚎2-cov-wfi]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/coverage.yml/badge.svg
542
584
  [🚎3-hd-wf]: https://github.com/ruby-oauth/oauth2-mcp/actions/workflows/heads.yml
@@ -560,12 +602,14 @@ Thanks for RTFM. ☺️
560
602
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
561
603
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
562
604
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
563
- [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
564
605
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
565
606
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
566
607
  [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
567
608
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
609
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
568
610
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
611
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
612
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
569
613
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
570
614
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
571
615
  [🤝gh-issues]: https://github.com/ruby-oauth/oauth2-mcp/issues
@@ -602,7 +646,7 @@ Thanks for RTFM. ☺️
602
646
  [📄license-ref]: MIT.md
603
647
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
604
648
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
605
- [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-✓-259D6C.svg?style=flat&logo=Apache
649
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
606
650
 
607
651
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
608
652
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
@@ -620,9 +664,9 @@ Thanks for RTFM. ☺️
620
664
  | Field | Value |
621
665
  |---|---|
622
666
  | Package | oauth2-mcp |
623
- | Description | 🔮 oauth2-mcp provides Ruby helpers for securing HTTP Model Context Protocol servers with OAuth protected-resource metadata, bearer challenges, and scoped authorization. |
667
+ | Description | 🍲 oauth2-mcp provides Ruby helpers for securing HTTP Model Context Protocol servers with OAuth protected-resource metadata, bearer challenges, and scoped authorization. |
624
668
  | Homepage | https://github.com/ruby-oauth/oauth2-mcp |
625
- | Source | https://github.com/ruby-oauth/oauth2-mcp/tree/v0.1.0 |
669
+ | Source | https://github.com/ruby-oauth/oauth2-mcp |
626
670
  | License | `MIT` |
627
- | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/oauth2-mcp, https://www.buymeacoffee.com/pboling |
671
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/oauth2-mcp, https://www.buymeacoffee.com/pboling |
628
672
  <!-- kettle-jem:metadata:end -->
data/SECURITY.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Version | Supported |
6
6
  |----------|-----------|
7
- | 1.latest | ✅ |
7
+ | 0.latest | ✅ |
8
8
 
9
9
  ## Security contact information
10
10
 
@@ -3,7 +3,7 @@
3
3
  module OAuth2
4
4
  module MCP
5
5
  module Version
6
- VERSION = "0.1.0"
6
+ VERSION = "0.1.2"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
data/lib/oauth2/mcp.rb CHANGED
@@ -39,7 +39,7 @@ module OAuth2
39
39
  audience: first_value(hash, :audience, "audience", :aud, "aud") || [],
40
40
  issuer: first_value(hash, :issuer, "issuer", :iss, "iss"),
41
41
  expires_at: first_value(hash, :expires_at, "expires_at", :exp, "exp"),
42
- raw: hash,
42
+ raw: hash
43
43
  )
44
44
  end
45
45
 
@@ -162,7 +162,7 @@ module OAuth2
162
162
  iss: issuer,
163
163
  verify_aud: !audience.nil?,
164
164
  aud: audience,
165
- leeway: leeway,
165
+ leeway: leeway
166
166
  }
167
167
  end
168
168
 
@@ -197,7 +197,7 @@ module OAuth2
197
197
  issuer: issuer,
198
198
  audience: audience,
199
199
  algorithms: algorithms || default_algorithms,
200
- leeway: leeway,
200
+ leeway: leeway
201
201
  )
202
202
  end
203
203
 
@@ -255,7 +255,7 @@ module OAuth2
255
255
  body: URI.encode_www_form(token: token, token_type_hint: token_type_hint),
256
256
  headers: {"Content-Type" => "application/x-www-form-urlencoded"},
257
257
  parse: :json,
258
- snaky: false,
258
+ snaky: false
259
259
  }
260
260
  end
261
261
 
@@ -294,7 +294,7 @@ module OAuth2
294
294
  issuer: issuer,
295
295
  audience: audience,
296
296
  algorithms: algorithms,
297
- leeway: leeway,
297
+ leeway: leeway
298
298
  )
299
299
  end
300
300
 
@@ -365,7 +365,7 @@ module OAuth2
365
365
  error: error,
366
366
  error_description: error_description,
367
367
  required_scopes: required_scopes,
368
- challenge: challenge,
368
+ challenge: challenge
369
369
  )
370
370
  end
371
371
  end
@@ -455,7 +455,7 @@ module OAuth2
455
455
  status: 401,
456
456
  error: nil,
457
457
  error_description: nil,
458
- required_scopes: required_scopes,
458
+ required_scopes: required_scopes
459
459
  )
460
460
  end
461
461
 
@@ -464,7 +464,7 @@ module OAuth2
464
464
  status: 401,
465
465
  error: "invalid_token",
466
466
  error_description: description,
467
- required_scopes: required_scopes,
467
+ required_scopes: required_scopes
468
468
  )
469
469
  end
470
470
 
@@ -473,7 +473,7 @@ module OAuth2
473
473
  status: 403,
474
474
  error: "insufficient_scope",
475
475
  error_description: "Additional scope is required.",
476
- required_scopes: required_scopes,
476
+ required_scopes: required_scopes
477
477
  )
478
478
  end
479
479
 
@@ -483,7 +483,7 @@ module OAuth2
483
483
  error: error,
484
484
  error_description: error_description,
485
485
  required_scopes: required_scopes,
486
- challenge: challenge(error: error, error_description: error_description, required_scopes: required_scopes),
486
+ challenge: challenge(error: error, error_description: error_description, required_scopes: required_scopes)
487
487
  )
488
488
  end
489
489
 
@@ -492,7 +492,7 @@ module OAuth2
492
492
  resource_metadata: resource_metadata_url,
493
493
  scope: required_scopes,
494
494
  error: error,
495
- error_description: error_description,
495
+ error_description: error_description
496
496
  )
497
497
  end
498
498
  end
@@ -516,7 +516,7 @@ module OAuth2
516
516
  {
517
517
  resource: resource,
518
518
  authorization_servers: authorization_servers,
519
- scopes_supported: scopes_supported,
519
+ scopes_supported: scopes_supported
520
520
  }.merge(metadata).compact
521
521
  end
522
522
 
@@ -550,7 +550,7 @@ module OAuth2
550
550
  resource_metadata: resource_metadata,
551
551
  scope: format_scope(scope),
552
552
  error: error,
553
- error_description: error_description,
553
+ error_description: error_description
554
554
  }.compact
555
555
 
556
556
  "Bearer #{parameters.map { |key, value| %(#{key}="#{escape(value)}") }.join(", ")}"
data/sig/oauth2/mcp.rbs CHANGED
@@ -1,7 +1,5 @@
1
1
  module OAuth2
2
2
  module MCP
3
- VERSION: String
4
-
5
3
  class Error < StandardError
6
4
  end
7
5
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oauth2-mcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -61,22 +61,22 @@ dependencies:
61
61
  name: oauth2
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - ">="
64
+ - - "~>"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '2.0'
67
- - - "~>"
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 2.0.20
69
+ version: 2.0.25
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '2.0'
77
- - - "~>"
77
+ - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 2.0.20
79
+ version: 2.0.25
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: version_gem
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -86,7 +86,7 @@ dependencies:
86
86
  version: '1.1'
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 1.1.9
89
+ version: 1.1.14
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
@@ -96,27 +96,27 @@ dependencies:
96
96
  version: '1.1'
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
- version: 1.1.9
99
+ version: 1.1.14
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: kettle-dev
102
102
  requirement: !ruby/object:Gem::Requirement
103
103
  requirements:
104
104
  - - "~>"
105
105
  - !ruby/object:Gem::Version
106
- version: '2.0'
106
+ version: '2.3'
107
107
  - - ">="
108
108
  - !ruby/object:Gem::Version
109
- version: 2.0.5
109
+ version: 2.3.4
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '2.0'
116
+ version: '2.3'
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: 2.0.5
119
+ version: 2.3.4
120
120
  - !ruby/object:Gem::Dependency
121
121
  name: bundler-audit
122
122
  requirement: !ruby/object:Gem::Requirement
@@ -171,20 +171,20 @@ dependencies:
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
- version: '3.0'
174
+ version: '3.1'
175
175
  - - ">="
176
176
  - !ruby/object:Gem::Version
177
- version: 3.0.6
177
+ version: 3.1.4
178
178
  type: :development
179
179
  prerelease: false
180
180
  version_requirements: !ruby/object:Gem::Requirement
181
181
  requirements:
182
182
  - - "~>"
183
183
  - !ruby/object:Gem::Version
184
- version: '3.0'
184
+ version: '3.1'
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 3.0.6
187
+ version: 3.1.4
188
188
  - !ruby/object:Gem::Dependency
189
189
  name: kettle-test
190
190
  requirement: !ruby/object:Gem::Requirement
@@ -194,7 +194,7 @@ dependencies:
194
194
  version: '2.0'
195
195
  - - ">="
196
196
  - !ruby/object:Gem::Version
197
- version: 2.0.1
197
+ version: 2.0.10
198
198
  type: :development
199
199
  prerelease: false
200
200
  version_requirements: !ruby/object:Gem::Requirement
@@ -204,7 +204,27 @@ dependencies:
204
204
  version: '2.0'
205
205
  - - ">="
206
206
  - !ruby/object:Gem::Version
207
- version: 2.0.1
207
+ version: 2.0.10
208
+ - !ruby/object:Gem::Dependency
209
+ name: turbo_tests2
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.1'
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: 3.1.8
218
+ type: :development
219
+ prerelease: false
220
+ version_requirements: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - "~>"
223
+ - !ruby/object:Gem::Version
224
+ version: '3.1'
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: 3.1.8
208
228
  - !ruby/object:Gem::Dependency
209
229
  name: ruby-progressbar
210
230
  requirement: !ruby/object:Gem::Requirement
@@ -228,7 +248,7 @@ dependencies:
228
248
  version: '1.0'
229
249
  - - ">="
230
250
  - !ruby/object:Gem::Version
231
- version: 1.0.3
251
+ version: 1.0.6
232
252
  type: :development
233
253
  prerelease: false
234
254
  version_requirements: !ruby/object:Gem::Requirement
@@ -238,7 +258,7 @@ dependencies:
238
258
  version: '1.0'
239
259
  - - ">="
240
260
  - !ruby/object:Gem::Version
241
- version: 1.0.3
261
+ version: 1.0.6
242
262
  - !ruby/object:Gem::Dependency
243
263
  name: gitmoji-regex
244
264
  requirement: !ruby/object:Gem::Requirement
@@ -248,7 +268,7 @@ dependencies:
248
268
  version: '2.0'
249
269
  - - ">="
250
270
  - !ruby/object:Gem::Version
251
- version: 2.0.0
271
+ version: 2.0.4
252
272
  type: :development
253
273
  prerelease: false
254
274
  version_requirements: !ruby/object:Gem::Requirement
@@ -258,12 +278,12 @@ dependencies:
258
278
  version: '2.0'
259
279
  - - ">="
260
280
  - !ruby/object:Gem::Version
261
- version: 2.0.0
262
- description: "\U0001F52E oauth2-mcp provides Ruby helpers for securing HTTP Model
281
+ version: 2.0.4
282
+ description: "\U0001F372 oauth2-mcp provides Ruby helpers for securing HTTP Model
263
283
  Context Protocol servers with OAuth protected-resource metadata, bearer challenges,
264
284
  and scoped authorization."
265
285
  email:
266
- - peter.boling@gmail.com
286
+ - floss@galtzo.com
267
287
  executables: []
268
288
  extensions: []
269
289
  extra_rdoc_files:
@@ -283,6 +303,7 @@ files:
283
303
  - CONTRIBUTING.md
284
304
  - FUNDING.md
285
305
  - LICENSE.md
306
+ - MIT.md
286
307
  - README.md
287
308
  - RUBOCOP.md
288
309
  - SECURITY.md
@@ -295,11 +316,11 @@ homepage: https://github.com/ruby-oauth/oauth2-mcp
295
316
  licenses:
296
317
  - MIT
297
318
  metadata:
298
- homepage_uri: https://structuredmerge.org
299
- source_code_uri: https://github.com/ruby-oauth/oauth2-mcp/tree/v0.1.0
300
- changelog_uri: https://github.com/ruby-oauth/oauth2-mcp/blob/v0.1.0/CHANGELOG.md
319
+ homepage_uri: https://oauth2-mcp.galtzo.com
320
+ source_code_uri: https://github.com/ruby-oauth/oauth2-mcp/tree/v0.1.2
321
+ changelog_uri: https://github.com/ruby-oauth/oauth2-mcp/blob/v0.1.2/CHANGELOG.md
301
322
  bug_tracker_uri: https://github.com/ruby-oauth/oauth2-mcp/issues
302
- documentation_uri: https://www.rubydoc.info/gems/oauth2-mcp/0.1.0
323
+ documentation_uri: https://www.rubydoc.info/gems/oauth2-mcp/0.1.2
303
324
  funding_uri: https://github.com/sponsors/pboling
304
325
  wiki_uri: https://github.com/ruby-oauth/oauth2-mcp/wiki
305
326
  news_uri: https://www.railsbling.com/tags/oauth2-mcp
@@ -307,7 +328,7 @@ metadata:
307
328
  rubygems_mfa_required: 'true'
308
329
  rdoc_options:
309
330
  - "--title"
310
- - "oauth2-mcp - \U0001F52E OAuth 2.1 resource-server helpers for MCP servers."
331
+ - "oauth2-mcp - \U0001F372 OAuth 2.1 resource-server helpers for MCP servers."
311
332
  - "--main"
312
333
  - README.md
313
334
  - "--exclude"
@@ -328,7 +349,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
328
349
  - !ruby/object:Gem::Version
329
350
  version: '0'
330
351
  requirements: []
331
- rubygems_version: 4.0.10
352
+ rubygems_version: 4.0.16
332
353
  specification_version: 4
333
- summary: "\U0001F52E OAuth 2.1 resource-server helpers for MCP servers."
354
+ summary: "\U0001F372 OAuth 2.1 resource-server helpers for MCP servers."
334
355
  test_files: []
metadata.gz.sig CHANGED
Binary file