Mirror of https://github.com/modelcontextprotocol/experimental-ext-interceptors — Status: Experimental. This repository provides a multi-language reference implementation of the proposed interceptor extension for the Model Context Protocol (MCP), as descr
  • C# 73.8%
  • Go 25.7%
  • TypeScript 0.2%
  • Python 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Kurt Degiorgio 074dc6cdbd
Rename mcpserver package to extension, remove *mcp.Server field (#11)
## Summary

- Rename `interceptors/mcpserver/` → `interceptors/extension/`,
replacing the `Server` wrapper with a lightweight `Extension` that can
install itself on any `*mcp.Server`
- Remove the stored `*mcp.Server` field — `Extension` is now a pure
interceptor container with no server reference
- Add `Install(server)` method to register JSON-RPC methods and init
middleware on a given server
- Update `LocalChain(ctx)` → `LocalChain(ctx, server)` to accept the
server as a parameter
- Remove `MCPServer()`, `Run()`, and `NewStreamableHTTPHandler()`
wrapper methods — users interact with `mcp.Server` directly
- Update all examples, tests, and documentation to use the new API

## Why

`mcpserver.Server` pretended to *be* the server — it had `Run()`,
`NewStreamableHTTPHandler()`, etc. — but it could never cover the full
`*mcp.Server` API, so users constantly needed `MCPServer()` to unwrap
it.

`Extension` doesn't pretend to be the server. It's a pure interceptor
container that can install itself on any server (or multiple servers)
on the fly. No stored server reference, no wrapping, no delegation
surface to maintain.

### Before

```go
mcpServer := mcp.NewServer(...)
srv := mcpserver.NewServer(mcpServer)
srv.AddInterceptor(v)
chain, err := srv.LocalChain(ctx)
```

### After

```go
mcpServer := mcp.NewServer(...)
ext := extension.New()
ext.AddInterceptor(v)
ext.Install(mcpServer)
chain, err := ext.LocalChain(ctx, mcpServer)
```

Signed-off-by: Kurt Degiorgio <kdegiorgio@bloomberg.net>
2026-04-30 15:57:18 +01:00
.githooks Implement Go interceptor chain (#4) 2026-04-29 15:29:25 +01:00
.github/workflows Implement Go interceptor chain (#4) 2026-04-29 15:29:25 +01:00
conformance Initial project structure for MCP interceptors (#3) 2026-01-26 17:54:37 +00:00
csharp/sdk C# Implementation (#2) 2026-01-27 23:53:44 +00:00
docs Implement Go interceptor chain (#4) 2026-04-29 15:29:25 +01:00
go/sdk Rename mcpserver package to extension, remove *mcp.Server field (#11) 2026-04-30 15:57:18 +01:00
python/sdk Initial project structure for MCP interceptors (#3) 2026-01-26 17:54:37 +00:00
typescript/sdk Initial project structure for MCP interceptors (#3) 2026-01-26 17:54:37 +00:00
.gitignore Implement Go interceptor chain (#4) 2026-04-29 15:29:25 +01:00
LICENSE Update license from MIT to Apache 2.0 2026-01-23 21:44:11 +00:00
README.md C# Implementation (#2) 2026-01-27 23:53:44 +00:00

MCP Interceptors (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 proposed interceptor extension for the Model Context Protocol (MCP), as described in SEP-1763.

Implementations

Language Directory Package Status
C# csharp/sdk/ ModelContextProtocol.Interceptors In Progress
Go go/sdk/ github.com/modelcontextprotocol/ext-interceptors/go/sdk Planned
Python python/sdk/ mcp-ext-interceptors Planned
TypeScript typescript/sdk/ @ext-modelcontextprotocol/interceptors Planned

CI/CD

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

How It Works

  1. Language-specific workflows (csharp.yml, 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