Modelcontextprotocol draft-sep
Research and draft a Specification Enhancement Proposal following the MCP SEP governance process
git clone https://github.com/modelcontextprotocol/modelcontextprotocol
T=$(mktemp -d) && git clone --depth=1 https://github.com/modelcontextprotocol/modelcontextprotocol "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/mcp-spec/skills/draft-sep" ~/.claude/skills/modelcontextprotocol-modelcontextprotocol-draft-sep && rm -rf "$T"
plugins/mcp-spec/skills/draft-sep/SKILL.mdDrafting a Specification Enhancement Proposal
This skill guides an author through producing a SEP that conforms to
docs/community/sep-guidelines.mdx and seps/TEMPLATE.md. Work through the phases in order — do not start writing the draft until the gate, interview, and research are complete.
Prerequisite: This skill must be run from a local clone of
modelcontextprotocol/modelcontextprotocol or a fork of it. Before doing anything else:
- Verify
exists in the working directory. If it does not, stop and tell the user to runseps/TEMPLATE.md
(or, if they are a maintainer with push access, clone the upstream repo directly) and re-run from its root.gh repo fork modelcontextprotocol/modelcontextprotocol --clone - Determine the canonical remote — the remote that points at
itself, not a fork. Inspectmodelcontextprotocol/modelcontextprotocol
: ifgit remote -v
points at the canonical repo, the canonical remote isorigin
. Iforigin
points at a fork, look for anorigin
remote; if none exists, add it withupstream
. The canonical remote is thengit remote add upstream https://github.com/modelcontextprotocol/modelcontextprotocol.git
.upstream - Run
and ensure localgit fetch {canonical}
is current withmain
so the research phases see up-to-date SEPs, schema, and{canonical}/main
.MAINTAINERS.md
Phase 6 references
{canonical} for the branch start-point and origin for the push target; these are the same remote for maintainers and different remotes for fork-based contributors.
Discuss before drafting. The SEP guidelines advise raising an idea in Discord or a Working Group or Interest Group meeting before opening a SEP. If the user has not discussed this idea anywhere yet, say so explicitly and ask whether they want to proceed anyway. A cold SEP is valid but more likely to stall — and if no sponsor is found within 6 months, Core Maintainers may close the PR and mark the SEP
dormant.
The SEP author is responsible for building consensus within the community and documenting dissenting opinions — capture both as you go.
Phase 1 — Gate
Before any interview or research, decide from the one-line
{idea} whether this is SEP-worthy.
Redirect (do not proceed) if the idea is:
- A bug fix or typo correction
- A documentation clarification
- Adding examples to an existing feature
- A minor schema fix that does not change behavior
For these, point the user at a regular pull request or the bug-report issue form instead and stop.
Proceed if the idea is:
- A new protocol feature or a change to an existing one
- A breaking change
- A governance or process change
- Anything controversial enough to need a design document and historical record
When unsure, the guidelines say to ask in Discord before starting significant work — point the user there rather than burning time on a draft that may not be SEP-worthy.
Phase 2 — Interview
Ask the user these six questions before touching any files. The answers feed directly into the draft.
- SEP type? Standards Track (core protocol feature), Extensions Track (extension rather than core — see SEP-2133), Informational (guidelines/design notes), or Process (governance/workflow change). Most SEPs are Standards Track. Note:
and the SEP guidelines list only three types; Extensions Track was added by SEP-2133 and has not yet been backfilled into those docs.seps/TEMPLATE.md- If Extensions Track: also ask which Working Group and Extension Maintainers will be responsible for the extension — SEP-2133 makes this a hard requirement, and an Extensions Track SEP MUST have at least one reference implementation in an official SDK prior to review.
- Is this a breaking change? Determines how much weight the Backward Compatibility section carries.
- Prototype status? There are two distinct gates: a working prototype is required before a SEP can be accepted, and a complete reference implementation is required before it can reach Final. The prototype proves feasibility — it doesn't need to be production-ready, but it must be runnable, not pseudocode. Does one exist, is one in progress, or is it still TBD?
- Where was this discussed? Discord thread, Working Group or Interest Group meeting, GitHub Discussion — the link becomes the consensus evidence in the Rationale section. If the answer is "nowhere," flag it (see above).
- Author and sponsor? Capture the author's name, email, and GitHub username for the
preamble field. Then ask about a sponsor: a SEP needs a Core Maintainer or Maintainer sponsor to enterAuthor(s)
status — the sponsor is what grants it. Until a sponsor signs on, the SEP sits in an "awaiting sponsor" state (Core Maintainers may close it asdraft
after 6 months). If the user has a sponsor lined up, capture their GitHub username (without thedormant
—@
expects a bare handle). If not, the preamble should readgh pr create --reviewer
and the finding-a-sponsor guidance fromSponsor: None
applies: tag 1-2 relevant maintainers fromdocs/community/sep-guidelines.mdx
on the PR, share in the relevant Discord channel, and if there's no response in two weeks ask inMAINTAINERS.md
.#general - Security implications? Does this proposal touch the attack surface — new transports, auth flows, data exposure, trust boundaries? The Security Implications section is required in
; even "none identified" needs to be stated explicitly with reasoning.seps/TEMPLATE.md
Phase 3 — Research
Run each step and capture the findings — they feed directly into the draft sections.
1. Current spec coverage
Use the
SearchModelContextProtocol tool on the mcp-docs MCP server (if available) to find what the spec already says about this area. If that server is not configured, fall back to grep -rn "{keyword}" docs/specification/draft/. This becomes the "why is the current spec inadequate" half of the Motivation section.
2. Prior art on GitHub
Invoke
/search-mcp-github {idea}. Look for:
- Merged PRs that touched the same surface
- Closed issues that asked for this (or something close)
- Prior discussions where maintainers set direction or rejected a similar approach
If a similar proposal was already rejected, that context is load-bearing — the new SEP needs to explain what changed.
3. Overlapping SEPs
grep -l -i "{keyword}" seps/*.md
Pick one or two keywords from the idea. If an existing SEP covers this area, the right move is usually to extend or supersede it rather than file a parallel proposal. Read any matches before continuing.
4. Design-principle and roadmap fit
Read
docs/community/design-principles.mdx and docs/development/roadmap.mdx. Identify which principles the proposal serves and which it is in tension with. Check whether the proposal aligns with current Core Maintainer priorities reflected in the roadmap — proposals outside current priorities are more likely to face delays in review. Both findings go in the Rationale section.
5. Schema touch-points
grep -n "{affected-type}" schema/draft/schema.ts
For Standards Track and Extensions Track SEPs, find the concrete types the spec change would add or modify. Reference these by name in the Specification section.
6. Exemplar SEPs
grep -l "Status.*Final" seps/*.md | head -3
Read two or three Final-status SEPs to see what a well-filled section looks like in practice. Match their level of detail.
Phase 4 — Draft
Read
seps/TEMPLATE.md and fill each section in order. Write to seps/0000-{slug}.md where {slug} is a lowercase, hyphenated version of the idea trimmed to ~50 characters (match the pattern of existing seps/*.md filenames). The 0000 placeholder is the documented convention from the SEP guidelines.
Everything above the
--- rule in the template is required — write "none identified" with reasoning rather than omitting a section. Headings under "Additional Optional Sections" are optional.
Preamble notes:
— leave blank or omit. Authors should request status changes through their sponsor rather than setting the field themselves.Status:
— from Q1.Type:
lists onlyseps/TEMPLATE.md
, butStandards Track | Informational | Process
is valid here per SEP-2133.Extensions Track
— today's date inCreated:
format.YYYY-MM-DD
—Author(s):
from Q5.Name <email> (@github-username)
—Sponsor:
from Q5, or the literal@github-username
.None
— set toPR:
(thehttps://github.com/modelcontextprotocol/modelcontextprotocol/pull/{NUMBER}
placeholder gets filled in Phase 6).{NUMBER}
Phase 5 — Checkpoint
Tell the user:
- The path to the draft file
- A one-line summary of what went into each section
Then ask: open a draft PR now, or stop here so they can edit the file first?
Do not proceed to Phase 6 without a yes.
Phase 6 — Open PR (only if the user says yes)
SEP-1850 documents an amend-based flow: open the PR with the
0000- placeholder, then immediately rename and amend so the final history is a single commit with the real number.
git fetch {canonical} git checkout -b sep/{slug} {canonical}/main git add seps/0000-{slug}.md git commit -m "SEP: {title}" git push -u origin sep/{slug} gh pr create --repo modelcontextprotocol/modelcontextprotocol --base main \ --title "SEP: {title}" --body "{one-paragraph summary}" --draft --reviewer {sponsor-username}
{canonical} is the remote established in the Prerequisite (either origin or upstream); origin is always the push target. If the sep/{slug} branch already exists (e.g., re-entering this phase after a checkpoint pause), reuse it instead of creating a new one. Omit --reviewer if Q5 answered None. If gh prompts for a default repository, run gh repo set-default modelcontextprotocol/modelcontextprotocol and retry.
Capture the PR number
{N} from gh pr create output, then backfill:
git mv seps/0000-{slug}.md seps/{N}-{slug}.md # edit the file: replace SEP-{NUMBER} with SEP-{N} in the title line, # fill the PR link in the preamble npm run generate:seps npm run format:docs git add seps/{N}-{slug}.md docs/seps/ docs/docs.json git commit --amend --no-edit git push --force-with-lease
The amend keeps the rename in one commit per SEP-1850.
npm run generate:seps renders docs/seps/{N}-{slug}.mdx and updates docs/docs.json (required for the render-seps.yml CI check), and npm run format:docs keeps the markdown-format.yml check green.
If Q5 answered
, the next step after the PR is open is finding a sponsor — tag 1-2 relevant maintainers from None
MAINTAINERS.md on the PR and share it in the relevant Discord channel. The 6-month clock starts now.