Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add functionality for MCP versions 2025-06-18 and 2025-11-25 - #175

Closed
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25
Closed

Add functionality for MCP versions 2025-06-18 and 2025-11-25#175
DePasqualeOrg wants to merge 8 commits into
modelcontextprotocol:mainfrom
DePasqualeOrg:2025-11-25

Conversation

@DePasqualeOrg

@DePasqualeOrgDePasqualeOrg commented Jan 4, 2026

Copy link
Copy Markdown

Edit: My full-featured, up-to-date MCP SDK for Swift, which fixes the issues in this repo detailed below and includes comprehensive documentation and convenience features, is available at DePasqualeOrg/mcp-sdk-swift.


I've implemented almost all the missing functionality in the Swift SDK, bringing it up to date with the latest protocol version. I also fixed several bugs that were noted in issues and PRs and many others that I found, and added tests for existing and new functionality. In some ways, the Swift SDK is now even more spec-compliant than the TypeScript and Python SDKs.

Over the course of five days, I used Opus 4.5 in Claude Code in a highly structured way to plan, generate, and verify the new functionality and tests based on the MCP spec and the TypeScript and Python SDKs. This included many rounds of verifications and corrections for each component.

I've found that this can work well with porting projects like this, where we have a clear spec and several mature SDKs in other languages, but review and real-world testing are still needed. I'm happy to keep improving anything that still needs work.

New in this PR

HTTP server support

  • HTTPServerTransport: Streamable HTTP (2025-03-26+)
  • The deprecated SSE server transport is not included, since streamable HTTP is now widely adopted.
  • SessionManager: Manages multiple client sessions
  • InMemoryEventStore: Event storage for session resumability
  • Examples for Hummingbird and Vapor

Protocol 2025-06-18 features

  • Elicitation (form mode): Servers can request structured input from users via form schemas
  • Structured tool output: structuredContent and outputSchema on tools
  • Resource links: ResourceLink content type in tool results
  • Title fields: title on Tools, Prompts, Resources, ResourceTemplates
  • Completions: Autocomplete suggestions for tool, prompt, and resource arguments

Protocol 2025-11-25 features

  • Tasks (experimental): Long-running operations with polling model
  • URL mode elicitation: Out-of-band flows for OAuth/credentials via external URLs
  • Icons: icons metadata on tools, resources, prompts, templates, implementations
  • Sampling tools: tools and toolChoice parameters in sampling requests
  • Tool execution metadata: taskSupport field for controlling task behavior
  • Enhanced enum schemas: Titled enums, multi-select, default values in elicitation
  • Tool name validation: Warns on invalid tool names per spec guidance

Core features (previously missing)

  • Progress notifications: Servers can report progress on long-running operations
  • Roots: Clients can expose root directory URIs to servers
  • MCP Protocol Logging: Servers can send log messages to clients

PRs superseded by this PR

  • #170: Fix stream consumption in receive loop
  • #171: Fix client receive loop spinning after transport closes
  • #167: Support 2025-06-18 spec
  • #168: Support progress notifications
  • #118: Small change: append handlers in situ
    • Cherry-picked for attribution, but should be merged separately before this PR, after which I'll rebase this branch

Issues resolved by this PR

  • #165: HTTP transport for servers

  • #142: Elicitation support

  • #139: ResourceLink in CallToolResult

  • #137: NetworkTransport crash on reconnect

  • #134: Update to latest spec version

  • #117: Tool.outputSchema and CallToolResult.structuredContent

  • #110: Streamable server support

  • #83: Completions support

  • #82: Progress tracking support

Remaining work for this PR

  • Merge PR #118 and rebase
  • Create docs for new functionality
  • Split docs into separate files
  • Suggestion: add automated formatting for smoother collaboration
    • Add .git-blame-ignore-revs with formatting commit hash

Future work

  • Schema validation for tool inputs and outputs, elicitation response
  • Add more convenience APIs like in TypeScript and Python SDKs
  • OAuth support

@lin72h

Copy link
Copy Markdown

Finally! Thanks for keeping the Swift community up to date with the rest of the SDK.

@DePasqualeOrg

DePasqualeOrg commented Jan 6, 2026

Copy link
Copy Markdown
Author

Note that about 2/3 of the total line count of this PR is tests.

I've had some discussions with people on the MCP Contributors Discord about the sheer size of this PR, and I understand the challenge of reviewing it in one go. If we decide to move ahead with it, I think we can split this up and do a phased review and release.

PhaseDescriptionLinesFiles
1Modified existing functionality~3,100 net17
2Streamable HTTP server~1,9203
32025-03-26 missing features~6506
42025-06-18 features~1,4503
52025-11-25 (non-Tasks)~7006
6Experimental Tasks~4,20010
Subtotal (Source)~12,00045
Refactored extensions*~2,4007
Examples & docs~1,4007
Total (excl. tests)~15,80059

I'd also like to encourage people to do the following:

  • Sample a part of the codebase that you're already familiar with and tell me what you think.
  • Try this PR for your use case and tell me if it works for you, and if not, what needs to be improved.
  • Use your favorite agent to compare the before and after of individual parts of this PR and give an assessment.
  • Use your favorite agent to compare individual parts of this PR to the spec and the TypeScript and Python SDKs and give an assessment.

I'd love to hear your feedback.

@DePasqualeOrg

Copy link
Copy Markdown
Author

Since I mentioned issues in the existing codebase that I fixed over the course of my work on this PR, I've compiled lists of bug fixes, code quality improvements, and spec compliance fixes that I made, separate from new functionality that was added.

@stallent

stallent commented Jan 7, 2026

Copy link
Copy Markdown
Contributor

Thank you for taking the time to do this! This is really helpful explaining your rational. Haven't skimmed the bug fixes but did skim the "code quality improvements" doc. Many of them are great and solid improvements, but several are not necessarily obvious wins and will need some discussion. We can discuss them individually when the time comes but we might want to break them out into their own PR's eventually so the ones that are obvious improvements can be accepted quickly and the others can get either tweaked or removed. Great stuff! I appreciate you continuing to improve your PR

@DePasqualeOrg

Copy link
Copy Markdown
Author

@stallent, I don't want to get bogged down in arguments over coding style. On most issues like this I'm willing to defer to the judgement of the best AI systems presented with the relevant information.

I'll continue development in DePasqualeOrg/mcp-swift-sdk. If anyone wants to help with review and testing, your feedback is very welcome.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@DePasqualeOrg@lin72h@stallent