meta-data-mcp 2.3.2__tar.gz → 2.3.3__tar.gz

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.
Files changed (128) hide show
  1. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/PKG-INFO +1 -1
  2. meta_data_mcp-2.3.3/meta_data_mcp/__init__.py +1 -0
  3. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/server.py +88 -16
  4. meta_data_mcp-2.3.2/meta_data_mcp/__init__.py +0 -1
  5. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/.gitignore +0 -0
  6. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/AUTHORS +0 -0
  7. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/LICENSE +0 -0
  8. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/README.md +0 -0
  9. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/cli.py +0 -0
  10. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/client.py +0 -0
  11. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/discovery/__init__.py +0 -0
  12. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/discovery/loader.py +0 -0
  13. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/discovery/state.py +0 -0
  14. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/errors.py +0 -0
  15. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/fields.py +0 -0
  16. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/health.py +0 -0
  17. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/oauth_provider.py +0 -0
  18. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/provenance.py +0 -0
  19. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/provider_config.py +0 -0
  20. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/__init__.py +0 -0
  21. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/__template__.py +0 -0
  22. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/au_data_gov.py +0 -0
  23. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/ca_open_gov.py +0 -0
  24. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/cern_opendata.py +0 -0
  25. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/ch_sbb.py +0 -0
  26. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/de_db.py +0 -0
  27. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/eu_copernicus.py +0 -0
  28. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/eu_ecb.py +0 -0
  29. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/eu_eurostat.py +0 -0
  30. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/fr_data_gouv.py +0 -0
  31. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_arxiv.py +0 -0
  32. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_bgpview.py +0 -0
  33. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_coingecko.py +0 -0
  34. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_crossref.py +0 -0
  35. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_dbnomics.py +0 -0
  36. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_disease_sh.py +0 -0
  37. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_epss.py +0 -0
  38. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_europepmc.py +0 -0
  39. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_faostat.py +0 -0
  40. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_frankfurter.py +0 -0
  41. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_gbif.py +0 -0
  42. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_gdelt.py +0 -0
  43. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_imf.py +0 -0
  44. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_inaturalist.py +0 -0
  45. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_met_museum.py +0 -0
  46. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_nvd_cve.py +0 -0
  47. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_oecd.py +0 -0
  48. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_open_library.py +0 -0
  49. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_open_meteo.py +0 -0
  50. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_openalex.py +0 -0
  51. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_openaq.py +0 -0
  52. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_opensanctions.py +0 -0
  53. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_opensky.py +0 -0
  54. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_osm_nominatim.py +0 -0
  55. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_osv_dev.py +0 -0
  56. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_overpass.py +0 -0
  57. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_pubchem.py +0 -0
  58. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_rcsb_pdb.py +0 -0
  59. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_ripe_stat.py +0 -0
  60. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_un_comtrade.py +0 -0
  61. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_unesco_heritage.py +0 -0
  62. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_who_gho.py +0 -0
  63. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_wikidata.py +0 -0
  64. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_wikipedia.py +0 -0
  65. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/global_world_bank.py +0 -0
  66. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/meta_data_mcp.py +0 -0
  67. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/nl_cbs.py +0 -0
  68. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/nl_ndov.py +0 -0
  69. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/nl_rechtspraak.py +0 -0
  70. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/nl_tweedekamer.py +0 -0
  71. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/sg_data_gov.py +0 -0
  72. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/uk_gov.py +0 -0
  73. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/uk_legislation.py +0 -0
  74. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/uk_ons.py +0 -0
  75. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_arcgis_item.py +0 -0
  76. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_cary.py +0 -0
  77. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_cdc_socrata.py +0 -0
  78. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_census_geocoder.py +0 -0
  79. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_cisa_kev.py +0 -0
  80. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_clinicaltrials.py +0 -0
  81. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_courtlistener.py +0 -0
  82. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_data_gov.py +0 -0
  83. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_faa_nasstatus.py +0 -0
  84. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_fayetteville.py +0 -0
  85. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_fda_openfda.py +0 -0
  86. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_federal_register.py +0 -0
  87. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_healthdata_gov.py +0 -0
  88. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_nasa.py +0 -0
  89. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_nc_onemap.py +0 -0
  90. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_ncdeq_gis.py +0 -0
  91. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_noaa_awc.py +0 -0
  92. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_noaa_ncei.py +0 -0
  93. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_noaa_tides.py +0 -0
  94. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_raleigh.py +0 -0
  95. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_sec_edgar.py +0 -0
  96. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_treasury_fiscal.py +0 -0
  97. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/providers/us_usgs_earthquake.py +0 -0
  98. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/registry.py +0 -0
  99. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/routing.py +0 -0
  100. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/sdk/__init__.py +0 -0
  101. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/sdk/remote.py +0 -0
  102. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/serialize.py +0 -0
  103. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/transport.py +0 -0
  104. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/__init__.py +0 -0
  105. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_discovery_v1.html +0 -0
  106. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_discovery_v1.py +0 -0
  107. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_entity_graph_v1.html +0 -0
  108. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_entity_graph_v1.py +0 -0
  109. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_molecular_v1.html +0 -0
  110. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_molecular_v1.py +0 -0
  111. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_museum_v1.html +0 -0
  112. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_museum_v1.py +0 -0
  113. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_network_topology_v1.html +0 -0
  114. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_network_topology_v1.py +0 -0
  115. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_news_tone_v1.html +0 -0
  116. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_news_tone_v1.py +0 -0
  117. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_trade_flows_v1.html +0 -0
  118. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_trade_flows_v1.py +0 -0
  119. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_vulnerability_v1.html +0 -0
  120. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/app_vulnerability_v1.py +0 -0
  121. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_geofeatures_v1.html +0 -0
  122. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_geofeatures_v1.py +0 -0
  123. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_records_v1.html +0 -0
  124. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_records_v1.py +0 -0
  125. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_timeseries_v1.html +0 -0
  126. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/ui_resources/shape_timeseries_v1.py +0 -0
  127. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/meta_data_mcp/utils.py +0 -0
  128. {meta_data_mcp-2.3.2 → meta_data_mcp-2.3.3}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meta-data-mcp
3
- Version: 2.3.2
3
+ Version: 2.3.3
4
4
  Summary: MCP server exposing 60+ open data providers to LLM clients via intelligent metadata routing.
5
5
  Project-URL: Homepage, https://github.com/derekslinz/meta-data-mcp
6
6
  Project-URL: Repository, https://github.com/derekslinz/meta-data-mcp
@@ -0,0 +1 @@
1
+ __version__ = "2.3.3"
@@ -281,11 +281,13 @@ class BearerAuthMiddleware:
281
281
  token: str | None = None,
282
282
  protected_prefixes: Sequence[str] = ("/sse", "/messages"),
283
283
  oauth_provider: Any = None,
284
+ resource_metadata_url: str | None = None,
284
285
  ) -> None:
285
286
  self.app = app
286
287
  self.token = token
287
288
  self.protected_prefixes = tuple(protected_prefixes)
288
289
  self.oauth_provider = oauth_provider
290
+ self.resource_metadata_url = resource_metadata_url
289
291
 
290
292
  async def __call__(self, scope: dict, receive: Callable, send: Callable) -> None:
291
293
  if scope.get("type") != "http" or not any(
@@ -320,10 +322,18 @@ class BearerAuthMiddleware:
320
322
 
321
323
  from starlette.responses import JSONResponse
322
324
 
325
+ if self.resource_metadata_url:
326
+ www_auth = (
327
+ f'Bearer realm="meta-data-mcp",'
328
+ f' resource_metadata="{self.resource_metadata_url}"'
329
+ )
330
+ else:
331
+ www_auth = 'Bearer realm="meta-data-mcp"'
332
+
323
333
  response = JSONResponse(
324
334
  {"error": "unauthorized"},
325
335
  status_code=401,
326
- headers={"WWW-Authenticate": 'Bearer realm="meta-data-mcp"'},
336
+ headers={"WWW-Authenticate": www_auth},
327
337
  )
328
338
  await response(scope, receive, send)
329
339
 
@@ -353,24 +363,38 @@ async def run_server(
353
363
  from starlette.responses import JSONResponse
354
364
  from starlette.routing import Mount, Route
355
365
 
366
+ from contextlib import asynccontextmanager
367
+
368
+ from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
369
+
356
370
  sse = SseServerTransport("/messages")
371
+ streamable_manager = StreamableHTTPSessionManager(server, stateless=True)
357
372
 
358
373
  class SseApp:
359
374
  async def __call__(self, scope, receive, send):
360
- log.info(f"New SSE connection request from {scope.get('client')}")
361
- try:
362
- async with sse.connect_sse(scope, receive, send) as streams:
363
- log.info("SSE connection established, running server...")
364
- await server.run(
365
- streams[0],
366
- streams[1],
367
- server.create_initialization_options(),
368
- )
369
- except Exception as e:
370
- # Connection closed by client is common and can be ignored or logged at debug
371
- log.debug(f"SSE connection error: {e}")
372
- finally:
373
- log.info("SSE connection closed")
375
+ method = scope.get("method", "").upper()
376
+ if method == "POST":
377
+ # StreamableHTTP transport — used by Claude.ai and newer clients.
378
+ await streamable_manager.handle_request(scope, receive, send)
379
+ else:
380
+ # Traditional SSE transport — GET /sse → long-lived event stream.
381
+ log.info(f"New SSE connection from {scope.get('client')}")
382
+ try:
383
+ async with sse.connect_sse(scope, receive, send) as streams:
384
+ await server.run(
385
+ streams[0],
386
+ streams[1],
387
+ server.create_initialization_options(),
388
+ )
389
+ except Exception as e:
390
+ log.debug(f"SSE connection error: {e}")
391
+ finally:
392
+ log.info("SSE connection closed")
393
+
394
+ @asynccontextmanager
395
+ async def lifespan(_app):
396
+ async with streamable_manager.run():
397
+ yield
374
398
 
375
399
  async def root(request):
376
400
  return JSONResponse(
@@ -552,6 +576,44 @@ async def run_server(
552
576
  default_scopes=["opendata"],
553
577
  ),
554
578
  )
579
+
580
+ # The MCP SDK hardcodes token_endpoint_auth_methods_supported to
581
+ # ["client_secret_post", "client_secret_basic"], omitting "none".
582
+ # Claude's OAuth client checks this list and refuses to proceed for
583
+ # public clients (PKCE-only, no secret) when "none" is missing.
584
+ # Override the well-known endpoint with a corrected copy before
585
+ # the SDK's route so Starlette's first-match wins.
586
+ _issuer_base = str(validated_oauth_issuer).rstrip("/")
587
+
588
+ async def patched_oauth_metadata(request: Request) -> JSONResponse:
589
+ payload = {
590
+ "issuer": str(validated_oauth_issuer),
591
+ "authorization_endpoint": f"{_issuer_base}/authorize",
592
+ "token_endpoint": f"{_issuer_base}/token",
593
+ "registration_endpoint": f"{_issuer_base}/register",
594
+ "scopes_supported": ["opendata"],
595
+ "response_types_supported": ["code"],
596
+ "grant_types_supported": [
597
+ "authorization_code",
598
+ "refresh_token",
599
+ ],
600
+ "token_endpoint_auth_methods_supported": [
601
+ "client_secret_post",
602
+ "client_secret_basic",
603
+ "none",
604
+ ],
605
+ "code_challenge_methods_supported": ["S256"],
606
+ }
607
+ return JSONResponse(
608
+ payload,
609
+ headers={
610
+ "Access-Control-Allow-Origin": "*",
611
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
612
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
613
+ "Cache-Control": "no-store",
614
+ },
615
+ )
616
+
555
617
  from starlette.responses import RedirectResponse as _RedirectResponse
556
618
 
557
619
  async def oidc_discovery(_request):
@@ -560,7 +622,16 @@ async def run_server(
560
622
  )
561
623
 
562
624
  extra_routes = (
563
- protected_resource_routes
625
+ [
626
+ # Must precede oauth_routes so Starlette's first-match wins:
627
+ # the SDK hardcodes "none" out of token_endpoint_auth_methods_supported.
628
+ Route(
629
+ "/.well-known/oauth-authorization-server",
630
+ endpoint=patched_oauth_metadata,
631
+ methods=["GET", "OPTIONS"],
632
+ ),
633
+ ]
634
+ + protected_resource_routes
564
635
  + oauth_routes
565
636
  + [
566
637
  Route(
@@ -580,6 +651,7 @@ async def run_server(
580
651
 
581
652
  app = Starlette(
582
653
  debug=False,
654
+ lifespan=lifespan,
583
655
  routes=[
584
656
  Route("/", endpoint=root),
585
657
  Route("/sse", endpoint=SseApp()),
@@ -1 +0,0 @@
1
- __version__ = "2.3.2"
File without changes
File without changes
File without changes
File without changes