René's URL Explorer Experiment


Title: Add experimental Server Cards support (SEP-2127) by SamMorrowDrums · Pull Request #2951 · modelcontextprotocol/python-sdk · GitHub

Open Graph Title: Add experimental Server Cards support (SEP-2127) by SamMorrowDrums · Pull Request #2951 · modelcontextprotocol/python-sdk

X Title: Add experimental Server Cards support (SEP-2127) by SamMorrowDrums · Pull Request #2951 · modelcontextprotocol/python-sdk

Description: Closes modelcontextprotocol/experimental-ext-server-card#16 Summary Experimental SDK support for MCP Server Cards (SEP-2127) and AI Catalog discovery, opt-in under mcp.{shared,server,client}.experimental. As an experimental extension, these APIs may change without notice. Takes over #2696 (thanks @dsp-ant — the original two commits are preserved with authorship), rebased cleanly onto current main. #2696 was stacked on the Tasks (SEP-1686) work, since removed from main (#2714). Opening as a draft for maintainer review — per the extension repo's contribution rules, AI-assisted changes are not self-merged. What it does A server builds a Server Card from its own identity, serves it from a Starlette app, and advertises it through an AI Catalog. A client discovers a host's catalog, then fetches and validates the cards it references. Cards describe identity and remote (HTTP) transport only — locally-runnable package metadata stays in the MCP Registry's server.json. Conformance to the v1 schema $schema is pinned to https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json; a card pointing at the registry's server.schema.json is rejected. A document that omits $schema is defaulted to the v1 URL rather than rejected. Media type — serving and catalog entries use the canonical application/mcp-server-card+json; the client recognizes only this type and skips catalog entries declaring anything else. Catalog identifiers are urn:air:{publisher}:{name} — the card name's reverse-DNS namespace turned back into the publisher's forward-DNS domain (com.example/weather → urn:air:example.com:weather). Discovery goes through an AI Catalog at /.well-known/ai-catalog.json, with the MCP-scoped /.well-known/mcp/catalog.json as a fallback. Discovery responses carry the CORS headers the spec requires (MUST) and Cache-Control (SHOULD). version accepts exact versions only; ranges and wildcards (^1.2.3, ~1.2.3, >=1.2.3, 1.x, 1 || 2, 1 - 2) are rejected. Verification pytest tests/experimental/, ruff check / ruff format --check, and pyright all pass; the full CI matrix (Python 3.10–3.14, Ubuntu + Windows, client/server conformance) is green. 🤖 Conformance commit assisted by GitHub Copilot. Update: Added strong SHA-256 ETag headers and If-None-Match conditional request handling for both Server Card and AI Catalog discovery responses, matching modelcontextprotocol/experimental-ext-server-card#33.

Open Graph Description: Closes modelcontextprotocol/experimental-ext-server-card#16 Summary Experimental SDK support for MCP Server Cards (SEP-2127) and AI Catalog discovery, opt-in under mcp.{shared,server,client}.experi...

X Description: Closes modelcontextprotocol/experimental-ext-server-card#16 Summary Experimental SDK support for MCP Server Cards (SEP-2127) and AI Catalog discovery, opt-in under mcp.{shared,server,client}.experi...

Opengraph URL: https://github.com/modelcontextprotocol/python-sdk/pull/2951

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:a32cf12c-573b-ebe5-d5a1-d0c442c2654b
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-id9D8C:21BB41:1C2719C:2600E0B:6A598624
html-safe-noncefbc2a714171a9484a5ca5077c7087411358da1eea4c59060be71bde33fcf33a6
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5RDhDOjIxQkI0MToxQzI3MTlDOjI2MDBFMEI6NkE1OTg2MjQiLCJ2aXNpdG9yX2lkIjoiNDc3MjczNDEwMzk2NzA3MzgyOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmac61ee535dc97a597e0bac63b63def4819dfdc0a517d88144484762dadd771439a
hovercard-subject-tagpull_request:3914876711
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/modelcontextprotocol/python-sdk/pull/2951/files
twitter:imagehttps://avatars.githubusercontent.com/u/4811358?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/4811358?s=400&v=4
og:image:altCloses modelcontextprotocol/experimental-ext-server-card#16 Summary Experimental SDK support for MCP Server Cards (SEP-2127) and AI Catalog discovery, opt-in under mcp.{shared,server,client}.experi...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonea540949572872b935b393b36db38922db390ae71c859537d741b8f3eb7e545b5
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git
octolytics-dimension-user_id182288589
octolytics-dimension-user_loginmodelcontextprotocol
octolytics-dimension-repository_id862584018
octolytics-dimension-repository_nwomodelcontextprotocol/python-sdk
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id862584018
octolytics-dimension-repository_network_root_nwomodelcontextprotocol/python-sdk
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release624bb50a7497aa346bef8cc3743af408a9ea10ca
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fpull%2F2951%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelcontextprotocol%2Fpython-sdk%2Fpull%2F2951%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=modelcontextprotocol%2Fpython-sdk
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Reloadhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
modelcontextprotocol https://github.com/modelcontextprotocol
python-sdkhttps://github.com/modelcontextprotocol/python-sdk
Notifications https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Fork 3.7k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Star 23.6k https://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk
Code https://github.com/modelcontextprotocol/python-sdk
Issues 255 https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests 301 https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality 6 https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
Code https://github.com/modelcontextprotocol/python-sdk
Issues https://github.com/modelcontextprotocol/python-sdk/issues
Pull requests https://github.com/modelcontextprotocol/python-sdk/pulls
Actions https://github.com/modelcontextprotocol/python-sdk/actions
Projects https://github.com/modelcontextprotocol/python-sdk/projects
Models https://github.com/modelcontextprotocol/python-sdk/models
Security and quality https://github.com/modelcontextprotocol/python-sdk/security
Insights https://github.com/modelcontextprotocol/python-sdk/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fmodelcontextprotocol%2Fpython-sdk%2Fissues%2Fnew%2Fchoose
SamMorrowDrumshttps://github.com/SamMorrowDrums
modelcontextprotocol:mainhttps://github.com/modelcontextprotocol/python-sdk/tree/main
SamMorrowDrums:experimental-server-card-v2https://github.com/SamMorrowDrums/python-sdk/tree/experimental-server-card-v2
Conversation 3 https://github.com/modelcontextprotocol/python-sdk/pull/2951
Commits 6 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits
Checks 28 https://github.com/modelcontextprotocol/python-sdk/pull/2951/checks
Files changed 19 https://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Add experimental Server Cards support (SEP-2127) https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#top
Show all changes 6 commits https://github.com/modelcontextprotocol/python-sdk/pull/2951/files
419b525 Add experimental Server Cards support (SEP-2127) dsp-ant May 26, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/419b5255eacc7972d864c8a3f4673d8f4a375191
e7e2179 Replace well-known server card discovery with AI Catalog discovery dsp-ant Jun 3, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/e7e21790c8cef96c72982006adacc6ecf844da4a
9d51af8 Align experimental Server Cards with SEP-2127 v1 schema SamMorrowDrums Jun 22, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/9d51af81b4687216a3fab48cde3d3b739284d947
c0255f9 Add ETag support to discovery responses SamMorrowDrums Jun 25, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/c0255f9ff4838eb25659051ac64b8d8828fae223
8bde3a4 Update ai_catalog.py SamMorrowDrums Jun 27, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/8bde3a4c844e73efb5e22dc231a3446f3cbaea56
9f42184 Adapt experimental Server Cards imports to mcp-types package restructure SamMorrowDrums Jul 13, 2026 https://github.com/modelcontextprotocol/python-sdk/pull/2951/commits/9f421843bb887b2206c7a51891df21d9e582ef1b
Clear filters https://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-c50f81becb354e053b7050b6789bb7e3722a4d2676ad4ff348d1630e981f45e7
ai_catalog.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-9830c2849315306c14679d1ae748eefcf1ef9e94dc4a67163590292daa39bae8
server_card.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-d426404380bb3bc9367512d6c5709f667679d22b1ebb8b165a2c798a78facc3d
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-503d6cf83faf06f6e22cec5af34c86e124bb27e9d573f5642dc9fecdc30e76f9
ai_catalog.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-798173f7588c6807bb9e0671732a08734d90709a0619e46556464d807e2537f8
server_card.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-22220ad3ae11b5f8b5caa9acad4f48c6567490e3662af7b0052d00a433f7d21f
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-f5e8df88cbf71ab04e4c31fc959897a75ce483018925af7563123cb479cca5d9
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-7d927a42e8f267637a18720fdfcbbda1fbf8f5208267ab8dabf035d84f55ad74
types.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-09b2e961a0e05b41afda8871df884cc76679ec5326a10d5de157de54928edba3
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-80d67b2ee3ab7a75c699a00badc86cd848bc4d92db97c3c296125393e0a5a411
types.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-945edaca9f2d619c8182f674d31c85cad0774163d73667801ac17425279f0322
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-3ca902bffc0fdc338a7f3d5b28dfb712f73853f750c2d373d6a8eee0db451b60
test_client.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-e8d9d3d2d76fa7b41ccd6a50e622ce7e565099568490ea5e5394303eec804003
test_server.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-73a72c35ee96d8139ab3cb96f0fe6a7274ca6d1342d061f6878fb69a693acb15
test_types.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-a6428be5e243ef62e02255431f82988afc3fc3b218aab6a824a605d88bc4b63c
__init__.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-565147bd9b60eba2232a924c089bfa64a0b9e632c533403d5504614a267027f5
test_client.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-521181cc220bd98f057f2b29fd1c31ad57e45636c9538c520416705378bca57d
test_server.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-b8cee7d080ae3e8002d442081fdfa9db5712d95bab4f9151c2e6718a3fc6beed
test_types.py https://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-bf5d6e1df3a49be4fe83129d9461df1bbd52d305563403efd5aa53252dd72e33
src/mcp/client/experimental/__init__.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-c50f81becb354e053b7050b6789bb7e3722a4d2676ad4ff348d1630e981f45e7
View file https://github.com/modelcontextprotocol/python-sdk/blob/9f421843bb887b2206c7a51891df21d9e582ef1b/src/mcp/client/experimental/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/2951/{{ revealButtonHref }}
src/mcp/client/experimental/ai_catalog.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-9830c2849315306c14679d1ae748eefcf1ef9e94dc4a67163590292daa39bae8
View file https://github.com/modelcontextprotocol/python-sdk/blob/9f421843bb887b2206c7a51891df21d9e582ef1b/src/mcp/client/experimental/ai_catalog.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/2951/{{ revealButtonHref }}
src/mcp/client/experimental/server_card.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-d426404380bb3bc9367512d6c5709f667679d22b1ebb8b165a2c798a78facc3d
View file https://github.com/modelcontextprotocol/python-sdk/blob/9f421843bb887b2206c7a51891df21d9e582ef1b/src/mcp/client/experimental/server_card.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/2951/{{ revealButtonHref }}
src/mcp/server/experimental/__init__.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-503d6cf83faf06f6e22cec5af34c86e124bb27e9d573f5642dc9fecdc30e76f9
View file https://github.com/modelcontextprotocol/python-sdk/blob/9f421843bb887b2206c7a51891df21d9e582ef1b/src/mcp/server/experimental/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/2951/{{ revealButtonHref }}
src/mcp/server/experimental/ai_catalog.pyhttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files#diff-798173f7588c6807bb9e0671732a08734d90709a0619e46556464d807e2537f8
View file https://github.com/modelcontextprotocol/python-sdk/blob/9f421843bb887b2206c7a51891df21d9e582ef1b/src/mcp/server/experimental/ai_catalog.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelcontextprotocol/python-sdk/pull/2951/{{ revealButtonHref }}
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
Please reload this pagehttps://github.com/modelcontextprotocol/python-sdk/pull/2951/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.