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%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
<!-- Provide a brief summary of your changes --> Route `interceptors/list` and `interceptor/invoke` through the receiving middleware chain so that middleware installed (audit, etc.) fires for interceptor protocol methods the same way it does for standard MCP methods. ## Motivation and Context <!-- Why is this change needed? What problem does it solve? --> Before this change, custom JSON-RPC methods were dispatched via a separate code path that bypassed receiving middleware entirely. This meant any middleware an operator installed would silently not apply to the interceptor protocol endpoints. The fix adds `AddReceivingCustomMethod[P, R, T]` as a package-level generic function to the vendored go-sdk/mcp package. Custom methods registered through it are stored in a per-server customMethods map and merged into `receivingMethodInfos()`, so `defaultReceivingMethodHandler` dispatches them exactly like built-in methods. External types satisfy the sealed `Params`/`Result` interfaces by embedding the `ParamsBase`/`ResultBase` types exported from the mcp package. ## How Has This Been Tested? <!-- Have you tested this in a real application? Which scenarios were tested? --> Existing test suites and new ones for verifying middleware paths. ## Breaking Changes <!-- Will users need to update their code or configurations? --> no. ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [x] I have added appropriate error handling - [x] I have added or updated documentation as needed ## Additional context <!-- Add any other context, implementation notes, or design decisions --> The changes to `vendor/go-sdk/mcp/server.go` are intentionally minimal and carry a `NOTE` comment acknowledging they are additions to the upstream SDK needed for this reference implementation. --------- Signed-off-by: Ukjae Jeong <jeongukjae@gmail.com> |
||
| .githooks | ||
| .github/workflows | ||
| conformance | ||
| csharp/sdk | ||
| docs | ||
| go/sdk | ||
| python/sdk | ||
| typescript/sdk | ||
| .gitignore | ||
| LICENSE | ||
| README.md | ||
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
-
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
-
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
-
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 -
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 ], -
Submit PR - Your new check is now required for all relevant changes!
License
Apache License 2.0 - See LICENSE file for details
Resources
- Interceptor Framework Specification (SEP-1763) - Full specification and design details
- Model Context Protocol