Mirror of https://github.com/modelcontextprotocol/experimental-ext-variants — Status: Experimental. This repository provides a multi-language reference implementation of the variants proposal for the Model Context Protocol (MCP), as described in SEP-2053.
  • Go 98.6%
  • Python 0.6%
  • TypeScript 0.6%
  • JavaScript 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Steven Chen 150c110128
Preserve context.Context across variant dispatch by bypassing in-memory transport (#6)
## Summary
- Switched variant dispatch from `ClientSession` RPC calls to direct
inner server handler invocation via a new `backendSession` type,
preserving `context.Context` values (e.g. `RequestContext`) that were
previously lost crossing the in-memory transport boundary
- Added `backendSession` abstraction in `session.go` that mirrors the
`mcp.ClientSession` API but calls the inner server's handler chain
directly, forwarding `RequestExtra` (token info, HTTP headers, etc.)
- Captured the inner server's handler chain via receiving middleware
(`captureMCPMethodHandler`) in `backend.go`, reused across all
connections
- Simplified `innerConnection` to hold `*backendSession` + cleanup;
in-memory transport/client kept alive only for notification forwarding
(progress, logging)
- Refactored `getSession` → `getConnection` returning `*innerConnection`
to reduce indirection in dispatch code
- Moved `injectVariantMeta` calls to after type assertion and nil checks
in all dispatch handlers for consistency and nil-safety

## Test plan
- [x] Existing variant dispatch tests pass (`go test ./variants/...`)
- [x] Verify context values (e.g. `RequestContext`) are available in
tool handlers when invoked through variant dispatch
- [x] Verify `RequestExtra` fields (token info, HTTP headers) are
forwarded to inner server handlers
2026-03-18 10:53:06 +00:00
.github/workflows Merge pull request #1 from modelcontextprotocol/chore/scaffolding 2026-01-27 20:10:28 +00:00
conformance Merge pull request #1 from modelcontextprotocol/chore/scaffolding 2026-01-27 20:10:28 +00:00
go/sdk Preserve context.Context across variant dispatch by bypassing in-memory transport (#6) 2026-03-18 10:53:06 +00:00
python/sdk Merge pull request #1 from modelcontextprotocol/chore/scaffolding 2026-01-27 20:10:28 +00:00
typescript/sdk Merge pull request #1 from modelcontextprotocol/chore/scaffolding 2026-01-27 20:10:28 +00:00
.gitignore Merge pull request #1 from modelcontextprotocol/chore/scaffolding 2026-01-27 20:10:28 +00:00
LICENSE Initial commit 2026-01-26 10:54:20 +00:00
README.md Add example servers for SEP-2053 variant patterns (#4) 2026-03-01 12:42:43 +05:30

MCP Variants (Experimental Extension)

Status: Experimental. This work is for prototyping and feedback only, and is not an accepted or official MCP extension.

This repository provides a multi-language reference implementation of the variants proposal for the Model Context Protocol (MCP), as described in SEP-2053.

Implementations

Language Directory Package Status
Go go/sdk/ github.com/modelcontextprotocol/experimental-ext-variants/go/sdk Planned
Python python/sdk/ mcp-ext-variants Planned
TypeScript typescript/sdk/ @ext-modelcontextprotocol/variants Planned

Examples (Go)

The Go implementation includes runnable example servers under go/sdk/examples/server/:

model-optimized/

Same tools, different descriptions per LLM family.

https://github.com/user-attachments/assets/5bb60cd2-291f-4940-abfe-f53852d35470

github/

Different tool sets per variant with custom ranking.

https://github.com/user-attachments/assets/d770ac55-e988-4d89-bdf8-bcb3cf1e2e53

research/

Context budget management via description verbosity.

trading/

API versioning, lifecycle statuses, and deprecation info.

variants-stdio/

Minimal single-variant setup.

CI/CD

This monorepo uses path-based CI workflows to efficiently test only what changes:

How It Works

  1. Language-specific workflows (python.yml, go.yml, typescript.yml)

    • Only trigger when their language directory or workflow file changes
    • Run all tests, linting, and checks for that language
  2. Status check workflow (status-check.yml)

    • Runs on every PR to verify required checks passed
    • Determines what needs to pass based on which files changed
    • This is the only required check in branch protection

Examples

  • Change python/sdk/file.py → Only Python CI runs → PR requires Python checks to pass
  • Change both Go and TypeScript files → Both CIs run → PR requires both to pass
  • Change only README.md → No language CIs run → PR can merge immediately

Forcing All Checks

To run all language checks regardless of changed files:

  • In a PR: Comment /test all (only works for repo owners/members/collaborators)
  • Manually: Use GitHub Actions UI or CLI to trigger individual workflows

Adding New Required Checks

  1. Add your check to the appropriate language workflow (e.g., python.yml):

    python-security-scan:
      name: "Security Scan"
      runs-on: ubuntu-latest
      steps:
        - name: Run security checks
          run: # your commands here
    
  2. Update the status check in .github/workflows/status-check.yml:

    const requiredChecks = {
      python: [
        'Python CI / Linting',
        'Python CI / Unit Tests (3.10)',
        // ... existing checks ...
        'Python CI / Security Scan'  // ← Add your new check
      ],
    
  3. Submit PR - Your new check is now required for all relevant changes!

License

Apache License 2.0 - See LICENSE file for details

Resources