{"url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998","id":3974861237,"node_id":"PR_kwDOM2nIG87s65G1","html_url":"https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2998","diff_url":"https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2998.diff","patch_url":"https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2998.patch","issue_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/2998","commits_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998/commits","review_comments_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998/comments","review_comment_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/comments{/number}","comments_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/2998/comments","statuses_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/statuses/0b7ddbd09eceacc3fb5f0d95c3429f2201c3d0bf","number":2998,"state":"open","locked":false,"title":"SEP-2998: Partial Tool Results (Streaming Tool Call Output)","user":{"login":"kuwatly","id":12585591,"node_id":"MDQ6VXNlcjEyNTg1NTkx","avatar_url":"https://avatars.githubusercontent.com/u/12585591?v=4","gravatar_id":"","url":"https://api.github.com/users/kuwatly","html_url":"https://github.com/kuwatly","followers_url":"https://api.github.com/users/kuwatly/followers","following_url":"https://api.github.com/users/kuwatly/following{/other_user}","gists_url":"https://api.github.com/users/kuwatly/gists{/gist_id}","starred_url":"https://api.github.com/users/kuwatly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kuwatly/subscriptions","organizations_url":"https://api.github.com/users/kuwatly/orgs","repos_url":"https://api.github.com/users/kuwatly/repos","events_url":"https://api.github.com/users/kuwatly/events{/privacy}","received_events_url":"https://api.github.com/users/kuwatly/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Proposes an optional, capability-gated `notifications/tools/partial_result`\r\nmechanism so servers can stream ordered, structured chunks during an\r\nin-flight `tools/call`, with the final `CallToolResult` remaining the sole\r\nauthoritative response. Enables MCP Apps to stream progressive-UI formats\r\nsuch as A2UI into their iframe within a single long-running tool call,\r\ncomposes with Tasks (SEP-2663) and progress notifications, and stays\r\nconsistent with the 2026-07-28 baseline (per-request capability\r\ndeclaration, no `initialize` handshake).\r\n\r\nCites and builds on prior art: #383, #651, #776 (closed), #982, SEP-1391,\r\nSEP-2133, SEP-2322, SEP-2632, SEP-2663.\r\n\r\n## Motivation and Context\r\n\r\n`tools/call` is strictly request → single final response today. This blocks\r\nseveral concrete cases: LLM-backed tools that produce token streams but must\r\nbuffer everything before returning (#117); MCP Apps iframes, which get\r\npartial *input* (`ui/notifications/tool-input-partial`) but no partial\r\n*output*, so a long-running tool can only show a generic spinner and\r\nprogressive-UI formats like A2UI can't stream into the app; and\r\nlog/monitor-style tools that resort to polling workarounds. Full motivation,\r\nprior-art comparison, and open questions are in the SEP itself.\r\n\r\n## How Has This Been Tested?\r\n\r\nNot yet, this is a Draft SEP at the proposal stage, no reference\r\nimplementation exists yet (tracked in the SEP's Reference Implementation\r\nsection). Per the SEP process, a prototype is required before the SEP can\r\nreach Accepted, not before opening this PR.\r\n\r\n## Breaking Changes\r\n\r\nNone. Fully additive: gated behind a new `partialResults` client capability,\r\nand the final `CallToolResult` is always complete and self-contained even if\r\na client never declares support or drops every partial.\r\n\r\n## Types of changes\r\n\r\n- [ ] Bug fix (non-breaking change which fixes an issue)\r\n- [x] New feature (non-breaking change which adds functionality)\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n- [ ] Documentation update\r\n\r\n## Checklist\r\n\r\n- [x] I have read the [MCP Documentation](https://modelcontextprotocol.io)\r\n- [x] My code follows the repository's style guidelines (matches `seps/TEMPLATE.md`; `npm run check` passes)\r\n- [x] New and existing tests pass locally (`npm run check`: schema, docs, and SEP validation all pass)\r\n- [ ] I have added appropriate error handling (N/A, this is a specification proposal, not an implementation)\r\n- [x] I have added or updated documentation as needed (this PR is the SEP document itself)\r\n\r\n## Additional context\r\n\r\nThis PR was drafted and researched with Claude Code. All cited issues, PRs,\r\nand SEPs, and all schema/capability claims (`ClientCapabilities` shape, the\r\nremoval of `initialize` in favor of per-request `_meta` capabilities,\r\n`server/discover`, the Tasks/SEP-2663 and MRTR/SEP-2322 interactions), were\r\nindependently verified against the GitHub API and this repo's own\r\n`schema/draft/schema.ts` rather than taken from memory. I'm seeking a\r\nsponsor per the SEP guidelines; no working group currently covers this area,\r\nso I'll be posting in Discord `#general` as well.\r\n","labels":[{"id":8912181189,"node_id":"LA_kwDOM2nIG88AAAACEzUXxQ","url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/labels/proposal","name":"proposal","description":"SEP proposal without a sponsor.","color":"75ef7d","default":false},{"id":8912181741,"node_id":"LA_kwDOM2nIG88AAAACEzUZ7Q","url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/labels/SEP","name":"SEP","description":"","color":"ee6cb9","default":false}],"milestone":null,"active_lock_reason":null,"created_at":"2026-07-02T01:15:22Z","updated_at":"2026-07-29T21:47:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5aa94ac9ea2893a7fda8045d61ce73c6101bea81","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"head":{"label":"kuwatly:sep-partial-tool-results","ref":"sep-partial-tool-results","repo":{"id":1286613084,"node_id":"R_kgDOTLAoXA","name":"modelcontextprotocol","full_name":"kuwatly/modelcontextprotocol","owner":{"login":"kuwatly","id":12585591,"node_id":"MDQ6VXNlcjEyNTg1NTkx","avatar_url":"https://avatars.githubusercontent.com/u/12585591?v=4","gravatar_id":"","url":"https://api.github.com/users/kuwatly","html_url":"https://github.com/kuwatly","followers_url":"https://api.github.com/users/kuwatly/followers","following_url":"https://api.github.com/users/kuwatly/following{/other_user}","gists_url":"https://api.github.com/users/kuwatly/gists{/gist_id}","starred_url":"https://api.github.com/users/kuwatly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kuwatly/subscriptions","organizations_url":"https://api.github.com/users/kuwatly/orgs","repos_url":"https://api.github.com/users/kuwatly/repos","events_url":"https://api.github.com/users/kuwatly/events{/privacy}","received_events_url":"https://api.github.com/users/kuwatly/received_events","type":"User","user_view_type":"public","site_admin":false},"private":false,"fork":true,"archived":false,"disabled":false,"description":"Specification and documentation for the Model Context Protocol","homepage":"https://modelcontextprotocol.io","language":null,"visibility":"public","is_template":false,"topics":[],"forks_count":0,"forks":0,"stargazers_count":0,"watchers_count":0,"watchers":0,"open_issues_count":0,"open_issues":0,"size":43305,"default_branch":"main","has_issues":false,"has_projects":true,"has_wiki":false,"has_pages":false,"has_downloads":false,"has_discussions":false,"has_pull_requests":true,"pushed_at":"2026-07-02T01:17:10Z","created_at":"2026-07-02T00:32:44Z","updated_at":"2026-07-02T00:32:45Z","allow_forking":true,"web_commit_signoff_required":false,"pull_request_creation_policy":"all","license":{"key":"other","name":"Other","url":null,"spdx_id":"NOASSERTION","node_id":"MDc6TGljZW5zZTA="},"url":"https://api.github.com/repos/kuwatly/modelcontextprotocol","html_url":"https://github.com/kuwatly/modelcontextprotocol","archive_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/{archive_format}{/ref}","assignees_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/assignees{/user}","blobs_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/git/blobs{/sha}","branches_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/branches{/branch}","collaborators_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/collaborators{/collaborator}","comments_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/comments{/number}","commits_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/commits{/sha}","compare_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/compare/{base}...{head}","contents_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/contents/{+path}","contributors_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/contributors","deployments_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/deployments","downloads_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/downloads","events_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/events","forks_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/forks","git_commits_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/git/commits{/sha}","git_refs_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/git/tags{/sha}","git_url":"git://github.com/kuwatly/modelcontextprotocol.git","issue_comment_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/issues/comments{/number}","issue_events_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/issues/events{/number}","issues_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/issues{/number}","keys_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/keys{/key_id}","labels_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/labels{/name}","languages_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/languages","merges_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/merges","milestones_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/milestones{/number}","notifications_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/notifications{?since,all,participating}","pulls_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/pulls{/number}","releases_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/releases{/id}","ssh_url":"git@github.com:kuwatly/modelcontextprotocol.git","stargazers_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/stargazers","statuses_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/statuses/{sha}","subscribers_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/subscribers","subscription_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/subscription","tags_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/tags","teams_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/teams","trees_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/git/trees{/sha}","clone_url":"https://github.com/kuwatly/modelcontextprotocol.git","mirror_url":null,"hooks_url":"https://api.github.com/repos/kuwatly/modelcontextprotocol/hooks","svn_url":"https://github.com/kuwatly/modelcontextprotocol"},"sha":"0b7ddbd09eceacc3fb5f0d95c3429f2201c3d0bf","user":{"login":"kuwatly","id":12585591,"node_id":"MDQ6VXNlcjEyNTg1NTkx","avatar_url":"https://avatars.githubusercontent.com/u/12585591?v=4","gravatar_id":"","url":"https://api.github.com/users/kuwatly","html_url":"https://github.com/kuwatly","followers_url":"https://api.github.com/users/kuwatly/followers","following_url":"https://api.github.com/users/kuwatly/following{/other_user}","gists_url":"https://api.github.com/users/kuwatly/gists{/gist_id}","starred_url":"https://api.github.com/users/kuwatly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kuwatly/subscriptions","organizations_url":"https://api.github.com/users/kuwatly/orgs","repos_url":"https://api.github.com/users/kuwatly/repos","events_url":"https://api.github.com/users/kuwatly/events{/privacy}","received_events_url":"https://api.github.com/users/kuwatly/received_events","type":"User","user_view_type":"public","site_admin":false}},"base":{"label":"modelcontextprotocol:main","ref":"main","repo":{"id":862570523,"node_id":"R_kgDOM2nIGw","name":"modelcontextprotocol","full_name":"modelcontextprotocol/modelcontextprotocol","owner":{"login":"modelcontextprotocol","id":182288589,"node_id":"O_kgDOCt2AzQ","avatar_url":"https://avatars.githubusercontent.com/u/182288589?v=4","gravatar_id":"","url":"https://api.github.com/users/modelcontextprotocol","html_url":"https://github.com/modelcontextprotocol","followers_url":"https://api.github.com/users/modelcontextprotocol/followers","following_url":"https://api.github.com/users/modelcontextprotocol/following{/other_user}","gists_url":"https://api.github.com/users/modelcontextprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/modelcontextprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/modelcontextprotocol/subscriptions","organizations_url":"https://api.github.com/users/modelcontextprotocol/orgs","repos_url":"https://api.github.com/users/modelcontextprotocol/repos","events_url":"https://api.github.com/users/modelcontextprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/modelcontextprotocol/received_events","type":"Organization","user_view_type":"public","site_admin":false},"private":false,"fork":false,"archived":false,"disabled":false,"description":"Specification and documentation for the Model Context Protocol","homepage":"https://modelcontextprotocol.io","language":"TypeScript","visibility":"public","is_template":false,"topics":["docs","mcp","specification","standard"],"forks_count":1768,"forks":1768,"stargazers_count":9132,"watchers_count":9132,"watchers":9132,"open_issues_count":141,"open_issues":141,"size":58714,"default_branch":"main","has_issues":true,"has_projects":true,"has_wiki":false,"has_pages":true,"has_downloads":false,"has_discussions":true,"has_pull_requests":true,"pushed_at":"2026-09-04T00:39:14Z","created_at":"2024-09-24T20:26:52Z","updated_at":"2026-09-04T08:03:35Z","allow_forking":true,"web_commit_signoff_required":false,"pull_request_creation_policy":"collaborators_only","license":{"key":"other","name":"Other","url":null,"spdx_id":"NOASSERTION","node_id":"MDc6TGljZW5zZTA="},"url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol","html_url":"https://github.com/modelcontextprotocol/modelcontextprotocol","archive_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/{archive_format}{/ref}","assignees_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/assignees{/user}","blobs_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/git/blobs{/sha}","branches_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/branches{/branch}","collaborators_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/collaborators{/collaborator}","comments_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/comments{/number}","commits_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/commits{/sha}","compare_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/compare/{base}...{head}","contents_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/contents/{+path}","contributors_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/contributors","deployments_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/deployments","downloads_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/downloads","events_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/events","forks_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/forks","git_commits_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/git/commits{/sha}","git_refs_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/git/tags{/sha}","git_url":"git://github.com/modelcontextprotocol/modelcontextprotocol.git","issue_comment_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/comments{/number}","issue_events_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/events{/number}","issues_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues{/number}","keys_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/keys{/key_id}","labels_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/labels{/name}","languages_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/languages","merges_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/merges","milestones_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/milestones{/number}","notifications_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/notifications{?since,all,participating}","pulls_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls{/number}","releases_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/releases{/id}","ssh_url":"git@github.com:modelcontextprotocol/modelcontextprotocol.git","stargazers_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/stargazers","statuses_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/statuses/{sha}","subscribers_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/subscribers","subscription_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/subscription","tags_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/tags","teams_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/teams","trees_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/git/trees{/sha}","clone_url":"https://github.com/modelcontextprotocol/modelcontextprotocol.git","mirror_url":null,"hooks_url":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/hooks","svn_url":"https://github.com/modelcontextprotocol/modelcontextprotocol"},"sha":"60dc69e9a9723a7bab535ade6c5c5b9695d97dfc","user":{"login":"modelcontextprotocol","id":182288589,"node_id":"O_kgDOCt2AzQ","avatar_url":"https://avatars.githubusercontent.com/u/182288589?v=4","gravatar_id":"","url":"https://api.github.com/users/modelcontextprotocol","html_url":"https://github.com/modelcontextprotocol","followers_url":"https://api.github.com/users/modelcontextprotocol/followers","following_url":"https://api.github.com/users/modelcontextprotocol/following{/other_user}","gists_url":"https://api.github.com/users/modelcontextprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/modelcontextprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/modelcontextprotocol/subscriptions","organizations_url":"https://api.github.com/users/modelcontextprotocol/orgs","repos_url":"https://api.github.com/users/modelcontextprotocol/repos","events_url":"https://api.github.com/users/modelcontextprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/modelcontextprotocol/received_events","type":"Organization","user_view_type":"public","site_admin":false}},"_links":{"comments":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/2998/comments"},"commits":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998/commits"},"statuses":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/statuses/0b7ddbd09eceacc3fb5f0d95c3429f2201c3d0bf"},"html":{"href":"https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2998"},"issue":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/issues/2998"},"review_comments":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998/comments"},"review_comment":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/comments{/number}"},"self":{"href":"https://api.github.com/repos/modelcontextprotocol/modelcontextprotocol/pulls/2998"}},"author_association":"NONE","auto_merge":null,"draft":false,"merged":false,"mergeable":true,"rebaseable":true,"mergeable_state":"clean","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":true,"commits":2,"additions":300,"deletions":0,"changed_files":4}