Skip to content

Commit 2552f8f

Browse files
authored
Merge branch 'main' into spec/sampling-includecontext
2 parents 0a004a0 + 4df299c commit 2552f8f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+15878
-309
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# Model Context Protocol (MCP)
22

3-
_Just heard of MCP and not sure where to start? See [the documentation website instead](https://modelcontextprotocol.io)._
3+
_Just heard of MCP and not sure where to start? Check out our [documentation website](https://modelcontextprotocol.io)._
44

55
This repo contains the:
66

77
- MCP specification
88
- MCP protocol schema
99
- Official MCP documentation
1010

11-
The schema is [defined in TypeScript](schema/2025-06-18/schema.ts) first, but
12-
[made available as JSON Schema](schema/2025-06-18/schema.json) as well, for wider
11+
The schema is [defined in TypeScript](schema/2025-11-25/schema.ts) first, but
12+
[made available as JSON Schema](schema/2025-11-25/schema.json) as well, for wider
1313
compatibility.
1414

1515
The official MCP documentation is built using Mintlify and available at

blog/content/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
+++
2-
title = 'blog'
2+
title = 'Model Context Protocol Blog'
33
+++

blog/content/posts/2025-11-25-first-mcp-anniversary.md

Lines changed: 271 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
+++
2+
date = '2025-11-28T11:00:00Z'
3+
title = 'SEPs Are Moving to Pull Requests'
4+
author = 'David Soria Parra (Lead Maintainer)'
5+
tags = ['announcement', 'governance', 'community', 'sep']
6+
+++
7+
8+
We're updating how Specification Enhancement Proposals (SEPs) are submitted and managed. Starting today, SEPs will be created as pull requests to the [`seps/` directory](https://github.com/modelcontextprotocol/modelcontextprotocol/tree/main/seps) instead of GitHub issues.
9+
10+
## Why the Change?
11+
12+
When we [introduced SEPs in July](https://blog.modelcontextprotocol.io/posts/2025-07-31-governance-for-mcp/), we chose GitHub Issues as our starting point. Issues are familiar to developers, low-friction, and got us up and running quickly. But as more proposals have come through the process, we've identified some key pain points:
13+
14+
**Scattered discussions.** With issues, the proposal text lives in the issue body while implementation details often end up in a separate PR. This splits the conversation and makes it harder to follow the full history of a proposal. This also introduces two distinct numbers referencing the same SEP, making it harder to consistently track and manage changes.
15+
16+
**No version history.** Issues don't have the same revision tracking that files in a repository do. When a SEP evolves through review, it's difficult to see what changed and when.
17+
18+
The new PR-based approach, inspired by [Python's PEP process](https://peps.python.org/), solves both problems.
19+
20+
## How It Works
21+
22+
The new workflow will be familiar if you've submitted pull requests on GitHub before:
23+
24+
1. **Draft your SEP** as a markdown file named `0000-your-feature.md` using the [SEP template](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/seps/TEMPLATE.md)
25+
26+
2. **Create a pull request** adding your SEP to the `seps/` directory
27+
28+
3. **Update the SEP number** once your PR is created, rename the file using the PR number (e.g., PR #1850 becomes `1850-your-feature.md`) and push a new commit with the rename
29+
30+
4. **Find a sponsor** from our [maintainer list](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/MAINTAINERS.md) to shepherd your proposal
31+
32+
5. **Iterate** on feedback directly in the PR
33+
34+
That's it. The PR number becomes the SEP number, discussion happens in one place, and git tracks every revision.
35+
36+
## What About Status?
37+
38+
One notable change: **sponsors are now responsible for updating SEP status**. In addition to applying labels to the pull request, the sponsor is responsible for ensuring that the `Status` field is updated in the SEP markdown file. This keeps the canonical state of the proposal in the file itself, versioned alongside the content, while PR labels make it easy to filter and find SEPs by status.
39+
40+
Status transitions work the same as before: `Draft` to `In-Review` to `Accepted` to `Final`, with the sponsor managing each transition as the proposal progresses.
41+
42+
## Getting Started
43+
44+
Ready to propose a change to MCP? Here's what you need to know:
45+
46+
**For new SEPs:**
47+
48+
- Read the latest [SEP Guidelines](https://modelcontextprotocol.io/community/sep-guidelines)
49+
- Use the [SEP template](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/seps/README.md#sep-file-structure) to create your proposal
50+
- Browse existing SEPs in the [`seps/` directory](https://github.com/modelcontextprotocol/modelcontextprotocol/tree/main/seps) for examples
51+
- Follow the workflow described above
52+
53+
**For existing SEPs:**
54+
If you have a SEP submitted as a GitHub issue, you can continue with your current workflow. We strongly encourage migrating to the new process for better version control and centralized discussion. To migrate:
55+
56+
1. Create a markdown file using the SEP template, starting with `0000-your-feature.md`
57+
2. Copy and adapt your proposal content to fit the template structure
58+
3. Submit a pull request to the `seps/` directory
59+
4. Rename the file using your new PR number (e.g., PR #1900 becomes `1900-your-feature.md`)
60+
5. Close the original issue with a link to the new PR
61+
62+
The new PR gets a fresh SEP number and gives your proposal proper version control and centralized discussion. Any valuable context from the original issue discussion should be summarized in the new SEP or referenced via links.
63+
64+
As always, if you're unsure whether your idea warrants a SEP, start a conversation on [Discord](https://modelcontextprotocol.io/community/communication#discord) or [GitHub Discussions](https://github.com/modelcontextprotocol/modelcontextprotocol/discussions). We're happy to help you figure out the right path forward.
65+
66+
## Thank You
67+
68+
This change is a direct result of feedback from contributors who've been through the SEP process. Your input helps us continuously improve how we build MCP together. Keep it coming.

blog/hugo.toml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
baseURL = 'https://blog.modelcontextprotocol.io/'
22
languageCode = 'en-us'
3-
title = 'mcp blog'
3+
title = 'Model Context Protocol Blog'
4+
copyright = 'Copyright © 2025 Model Context Protocol Project. All rights reserved.'
45
theme = 'github.com/adityatelange/hugo-PaperMod'
56
[pagination]
67
pagerSize = 5
@@ -9,6 +10,9 @@ theme = 'github.com/adityatelange/hugo-PaperMod'
910
author = "The MCP project"
1011
description = "Updates from the Model Context Protocol project"
1112

13+
[params.homeInfoParams]
14+
Content = "Get the latest updates from protocol maintainers and contributors about new developments, upcoming features, and real-world MCP implementations."
15+
1216
# PaperMod specific settings
1317
# defaultTheme = "dark" # MCP uses a dark theme
1418
disableThemeToggle = false
@@ -25,19 +29,19 @@ theme = 'github.com/adityatelange/hugo-PaperMod'
2529
comments = false
2630
hidemeta = false
2731
hideSummary = false
28-
showtoc = false
2932
ShowFullTextinRSS = true
3033

31-
# Custom copyright
32-
copyright = '© 2025 Model Context Protocol Project'
33-
3434
[params.assets]
3535
favicon = "favicon.svg"
3636

3737
[[params.socialIcons]]
3838
name = "github"
3939
url = "https://github.com/modelcontextprotocol"
4040

41+
[[params.socialIcons]]
42+
name = "linkedin"
43+
url = "https://linkedin.com/company/modelcontextprotocol"
44+
4145
# Menu configuration
4246
[[menu.main]]
4347
identifier = "docs"

blog/layouts/partials/footer.html

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
{{- if not (.Param "hideFooter") }}
2+
<footer class="footer">
3+
{{- if not site.Params.footer.hideCopyright }}
4+
{{- if site.Copyright }}
5+
<span>{{ site.Copyright | markdownify }}</span>
6+
{{- else }}
7+
<span>&copy; {{ now.Year }} <a href="{{ "" | absLangURL }}">{{ site.Title }}</a></span>
8+
{{- end }}
9+
{{- end }}
10+
{{- with site.Params.footer.text }}
11+
{{ . | markdownify }}
12+
{{- end }}
13+
</footer>
14+
{{- end }}
15+
16+
{{- if (not site.Params.disableScrollToTop) }}
17+
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
18+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
19+
<path d="M12 6H0l6-6z" />
20+
</svg>
21+
</a>
22+
{{- end }}
23+
24+
{{- partial "extend_footer.html" . }}
25+
26+
<script>
27+
let menu = document.getElementById('menu');
28+
if (menu) {
29+
const scrollPosition = localStorage.getItem("menu-scroll-position");
30+
if (scrollPosition) {
31+
menu.scrollLeft = parseInt(scrollPosition, 10);
32+
}
33+
34+
menu.onscroll = function () {
35+
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
36+
}
37+
}
38+
39+
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
40+
anchor.addEventListener("click", function (e) {
41+
e.preventDefault();
42+
var id = this.getAttribute("href").substr(1);
43+
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
44+
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
45+
behavior: "smooth"
46+
});
47+
} else {
48+
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
49+
}
50+
if (id === "top") {
51+
history.replaceState(null, null, " ");
52+
} else {
53+
history.pushState(null, null, `#${id}`);
54+
}
55+
});
56+
});
57+
</script>
58+
59+
{{- if (not site.Params.disableScrollToTop) }}
60+
<script>
61+
var mybutton = document.getElementById("top-link");
62+
window.onscroll = function () {
63+
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
64+
mybutton.style.visibility = "visible";
65+
mybutton.style.opacity = "1";
66+
} else {
67+
mybutton.style.visibility = "hidden";
68+
mybutton.style.opacity = "0";
69+
}
70+
};
71+
</script>
72+
{{- end }}
73+
74+
{{- if (not site.Params.disableThemeToggle) }}
75+
<script>
76+
document.getElementById("theme-toggle").addEventListener("click", () => {
77+
const html = document.querySelector("html");
78+
if (html.dataset.theme === "dark") {
79+
html.dataset.theme = 'light';
80+
localStorage.setItem("pref-theme", 'light');
81+
} else {
82+
html.dataset.theme = 'dark';
83+
localStorage.setItem("pref-theme", 'dark');
84+
}
85+
})
86+
</script>
87+
{{- end }}
88+
89+
{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }}
90+
<script>
91+
document.querySelectorAll('pre > code').forEach((codeblock) => {
92+
const container = codeblock.parentNode.parentNode;
93+
const copybutton = document.createElement('button');
94+
copybutton.classList.add('copy-code');
95+
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
96+
97+
function copyingDone() {
98+
copybutton.innerHTML = '{{- i18n "code_copied" | default "copied!" }}';
99+
setTimeout(() => {
100+
copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
101+
}, 2000);
102+
}
103+
104+
copybutton.addEventListener('click', (cb) => {
105+
if ('clipboard' in navigator) {
106+
navigator.clipboard.writeText(codeblock.textContent);
107+
copyingDone();
108+
return;
109+
}
110+
111+
const range = document.createRange();
112+
range.selectNodeContents(codeblock);
113+
const selection = window.getSelection();
114+
selection.removeAllRanges();
115+
selection.addRange(range);
116+
try {
117+
document.execCommand('copy');
118+
copyingDone();
119+
} catch (e) { };
120+
selection.removeRange(range);
121+
});
122+
123+
if (container.classList.contains("highlight")) {
124+
container.appendChild(copybutton);
125+
} else if (container.parentNode.firstChild == container) {
126+
// td containing LineNos
127+
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
128+
// table containing LineNos and code
129+
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
130+
} else {
131+
// code blocks not having highlight as parent class
132+
codeblock.parentNode.appendChild(copybutton);
133+
}
134+
});
135+
</script>
136+
{{- end }}
240 KB
Loading
393 KB
Loading
155 KB
Loading
441 KB
Loading

0 commit comments

Comments
 (0)