plugins/mcp-spec/skills/draft-sep/SKILL.md
Research and draft a Specification Enhancement Proposal following the MCP SEP governance process
npx skillsauth add modelcontextprotocol/modelcontextprotocol draft-sepInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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:
seps/TEMPLATE.md exists in the working directory. If it does not, stop and tell the user to run gh repo fork modelcontextprotocol/modelcontextprotocol --clone (or, if they are a maintainer with push access, clone the upstream repo directly) and re-run from its root.modelcontextprotocol/modelcontextprotocol itself, not a fork. Inspect git remote -v: if origin points at the canonical repo, the canonical remote is origin. If origin points at a fork, look for an upstream remote; if none exists, add it with git remote add upstream https://github.com/modelcontextprotocol/modelcontextprotocol.git. The canonical remote is then upstream.git fetch {canonical} and ensure local main is current with {canonical}/main so the research phases see up-to-date SEPs, schema, and 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.
Before any interview or research, decide from the one-line {idea} whether this is SEP-worthy.
Redirect (do not proceed) if the idea is:
For these, point the user at a regular pull request or the bug-report issue form instead and stop.
Proceed if the idea is:
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.
Ask the user these six questions before touching any files. The answers feed directly into the draft.
seps/TEMPLATE.md and the SEP guidelines list only three types; Extensions Track was added by SEP-2133 and has not yet been backfilled into those docs.
Author(s) preamble field. Then ask about a sponsor: a SEP needs a Core Maintainer or Maintainer sponsor to enter draft 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 as dormant after 6 months). If the user has a sponsor lined up, capture their GitHub username (without the @ — gh pr create --reviewer expects a bare handle). If not, the preamble should read Sponsor: None and the finding-a-sponsor guidance from docs/community/sep-guidelines.mdx applies: tag 1-2 relevant maintainers from MAINTAINERS.md on the PR, share in the relevant Discord channel, and if there's no response in two weeks ask in #general.seps/TEMPLATE.md; even "none identified" needs to be stated explicitly with reasoning.Run each step and capture the findings — they feed directly into the draft sections.
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.
Invoke /search-mcp-github {idea}. Look for:
If a similar proposal was already rejected, that context is load-bearing — the new SEP needs to explain what changed.
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.
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.
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.
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.
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:
Status: — leave blank or omit. Authors should request status changes through their sponsor rather than setting the field themselves.Type: — from Q1. seps/TEMPLATE.md lists only Standards Track | Informational | Process, but Extensions Track is valid here per SEP-2133.Created: — today's date in YYYY-MM-DD format.Author(s): — Name <email> (@github-username) from Q5.Sponsor: — @github-username from Q5, or the literal None.PR: — set to https://github.com/modelcontextprotocol/modelcontextprotocol/pull/{NUMBER} (the {NUMBER} placeholder gets filled in Phase 6).Tell the user:
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.
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 None, the next step after the PR is open is finding a sponsor — tag 1-2 relevant maintainers from MAINTAINERS.md on the PR and share it in the relevant Discord channel. The 6-month clock starts now.
tools
Search MCP PRs, issues, and discussions across the modelcontextprotocol GitHub org
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------