Skip to content

Commit 89e8946

Browse files
olaservoclaude
andcommitted
feat(skills): expand SEP-2640 demo with catalogue, templates, discovery
Expands the Agent Skills surface from 2 to 28 bundled skills, adds a per-repo resource template covering arbitrary GitHub repositories, and introduces a model-facing discovery tool to bridge the gap left by the SEP's UI-only completion mechanism. - Import 25 workflow-oriented skills from github#2374 as standalone SKILL.md files (skip review-pr and handle-notifications due to overlap with our pull-requests / inbox-triage). Migrate URI shape to skill://github/<name>/SKILL.md to match github#2374's prefix style. - Remove the legacy Instructions / InstructionsFunc / WithServerInstructions machinery (~300 lines). Skills are now the only guidance surface. - Add a SEP-aligned per-repo resource template skill://{owner}/{repo}/{skill_name}/{+file_path} (from PR github#2129, with the non-SEP _manifest endpoint dropped). Gated on a new non-default `skills` toolset. Index now advertises both SEP entry types (skill-md and mcp-resource-template). - Add list_repo_skills tool that wraps the existing discoverSkills() and returns each discovered skill plus a skill:// URL ready for resources/read. Workaround for autonomous-agent discovery on unbounded template namespaces — documented as such. - Add discover-mcp-skills meta-skill (always-on) that teaches the model the discover-then-read workflow for both bundled and repo-hosted surfaces. Verified end-to-end against anthropics/skills via stdio JSON-RPC: full loop from index read through SKILL.md to relative-file resolution works. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 86f0549 commit 89e8946

46 files changed

Lines changed: 2464 additions & 497 deletions

File tree

Some content is hidden

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

internal/ghmcp/server.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ func NewStdioMCPServer(ctx context.Context, cfg github.MCPServerConfig) (*mcp.Se
143143
WithToolsets(github.ResolvedEnabledToolsets(cfg.DynamicToolsets, cfg.EnabledToolsets, cfg.EnabledTools)).
144144
WithTools(github.CleanTools(cfg.EnabledTools)).
145145
WithExcludeTools(cfg.ExcludeTools).
146-
WithServerInstructions().
147146
WithFeatureChecker(featureChecker)
148147

149148
// Apply token scope filtering if scopes are known (for PAT filtering)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"annotations": {
3+
"readOnlyHint": true,
4+
"title": "List Agent Skills in a repository"
5+
},
6+
"description": "List Agent Skills (SKILL.md files) defined in a GitHub repository. Returns each discovered skill's name plus a `skill://` URI you can pass directly to `resources/read` to fetch its SKILL.md. Recognizes the agentskills.io directory conventions: skills/*/SKILL.md, skills/{namespace}/*/SKILL.md, plugins/*/skills/*/SKILL.md, and root-level */SKILL.md. Use this when you need to discover what skills a repository exposes before reading any of them.",
7+
"inputSchema": {
8+
"properties": {
9+
"owner": {
10+
"description": "Repository owner (username or organization name).",
11+
"type": "string"
12+
},
13+
"repo": {
14+
"description": "Repository name.",
15+
"type": "string"
16+
}
17+
},
18+
"required": [
19+
"owner",
20+
"repo"
21+
],
22+
"type": "object"
23+
},
24+
"name": "list_repo_skills"
25+
}

pkg/github/bundled_skills.go

Lines changed: 149 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import (
88
)
99

1010
// bundledSkills builds the registry of Agent Skills this server ships.
11-
// Each entry's Enabled closure gates its publication on the relevant
12-
// toolset being enabled under the given inventory.
11+
//
12+
// The first two entries are toolset-gated — they only register when the
13+
// relevant toolset is enabled. The remaining workflow-oriented skills
14+
// (ported from github/github-mcp-server#2374) are always-on; their
15+
// `allowed-tools` frontmatter is advisory metadata, not a gate.
1316
//
1417
// Adding a new server-bundled skill is one entry here plus a //go:embed
1518
// line in package skills.
@@ -28,6 +31,150 @@ func bundledSkills(inv *inventory.Inventory) *skills.Registry {
2831
Content: skills.InboxTriageSKILL,
2932
Icons: octicons.Icons("bell"),
3033
Enabled: func() bool { return inv.IsToolsetEnabled(ToolsetMetadataNotifications.ID) },
34+
}).
35+
Add(skills.Bundled{
36+
Name: "get-context",
37+
Description: "Understand the current user, their permissions, and team membership. Use when starting any workflow, checking who you are, what you can access, or looking up team membership.",
38+
Content: skills.GetContextSKILL,
39+
}).
40+
Add(skills.Bundled{
41+
Name: "explore-repo",
42+
Description: "Understand an unfamiliar codebase quickly. Use when exploring a new repo, understanding project structure, finding entry points, or getting oriented in code you haven't seen before.",
43+
Content: skills.ExploreRepoSKILL,
44+
}).
45+
Add(skills.Bundled{
46+
Name: "search-code",
47+
Description: "Find code patterns, symbols, and examples across GitHub. Use when searching for code, finding how something is implemented, locating files, or looking for usage examples across repositories.",
48+
Content: skills.SearchCodeSKILL,
49+
}).
50+
Add(skills.Bundled{
51+
Name: "trace-history",
52+
Description: "Understand why code changed by tracing commits and PRs. Use when investigating git history, finding who changed something, understanding the motivation behind a change, or tracking down when a bug was introduced.",
53+
Content: skills.TraceHistorySKILL,
54+
}).
55+
Add(skills.Bundled{
56+
Name: "create-pr",
57+
Description: "Create a well-structured pull request that reviews smoothly. Use when opening a new PR, pushing changes for review, or submitting code changes to a repository.",
58+
Content: skills.CreatePRSKILL,
59+
}).
60+
Add(skills.Bundled{
61+
Name: "self-review-pr",
62+
Description: "Review your own PR before requesting team review. Use when you want to self-check your PR, verify CI status, polish description, or prepare your changes for review.",
63+
Content: skills.SelfReviewPRSKILL,
64+
}).
65+
Add(skills.Bundled{
66+
Name: "address-pr-feedback",
67+
Description: "Handle review comments on your PR and push fixes. Use when you received PR feedback, need to respond to reviewer comments, resolve threads, or push fixes based on review.",
68+
Content: skills.AddressPRFeedbackSKILL,
69+
}).
70+
Add(skills.Bundled{
71+
Name: "merge-pr",
72+
Description: "Get a PR to merge-ready state and merge it. Use when merging a pull request, checking if a PR is ready to merge, updating a PR branch, or converting a draft PR.",
73+
Content: skills.MergePRSKILL,
74+
}).
75+
Add(skills.Bundled{
76+
Name: "triage-issues",
77+
Description: "Categorize, deduplicate, and prioritize incoming issues. Use when triaging issues, labeling bugs, organizing a backlog, closing duplicates, or processing new issue reports.",
78+
Content: skills.TriageIssuesSKILL,
79+
}).
80+
Add(skills.Bundled{
81+
Name: "create-issue",
82+
Description: "Create well-structured, searchable, actionable issues. Use when filing a bug report, requesting a feature, creating a task, or opening any new GitHub issue.",
83+
Content: skills.CreateIssueSKILL,
84+
}).
85+
Add(skills.Bundled{
86+
Name: "manage-sub-issues",
87+
Description: "Break down large issues into trackable sub-tasks. Use when decomposing epics, creating task breakdowns, organizing work into smaller pieces, or managing parent-child issue relationships.",
88+
Content: skills.ManageSubIssuesSKILL,
89+
}).
90+
Add(skills.Bundled{
91+
Name: "debug-ci",
92+
Description: "Investigate and fix failing GitHub Actions workflows. Use when CI is failing, a workflow run errored, you need to read build logs, or debug why tests aren't passing.",
93+
Content: skills.DebugCISKILL,
94+
}).
95+
Add(skills.Bundled{
96+
Name: "trigger-workflow",
97+
Description: "Run, rerun, or cancel GitHub Actions workflow runs. Use when triggering a deployment, rerunning failed jobs, canceling a stuck workflow, or dispatching a workflow manually.",
98+
Content: skills.TriggerWorkflowSKILL,
99+
}).
100+
Add(skills.Bundled{
101+
Name: "security-audit",
102+
Description: "Systematically review code scanning, secret, and dependency alerts. Use when auditing repo security, checking for vulnerabilities, reviewing CodeQL alerts, or investigating exposed secrets.",
103+
Content: skills.SecurityAuditSKILL,
104+
}).
105+
Add(skills.Bundled{
106+
Name: "fix-dependabot",
107+
Description: "Handle vulnerable dependency alerts and update PRs. Use when fixing Dependabot alerts, updating vulnerable packages, reviewing dependency update PRs, or managing supply chain security.",
108+
Content: skills.FixDependabotSKILL,
109+
}).
110+
Add(skills.Bundled{
111+
Name: "research-vulnerability",
112+
Description: "Query the GitHub Advisory Database for security advisories. Use when researching CVEs, looking up GHSA IDs, checking if a package has known vulnerabilities, or reviewing security advisories for a repo or org.",
113+
Content: skills.ResearchVulnerabilitySKILL,
114+
}).
115+
Add(skills.Bundled{
116+
Name: "manage-project",
117+
Description: "Track and update work items in GitHub Projects (v2). Use when managing a project board, updating issue status fields, adding items to a project, querying project items, or posting project status updates.",
118+
Content: skills.ManageProjectSKILL,
119+
}).
120+
Add(skills.Bundled{
121+
Name: "prepare-release",
122+
Description: "Compile release notes from commits and merged PRs. Use when preparing a release, writing a changelog, summarizing changes since last version, or reviewing what shipped.",
123+
Content: skills.PrepareReleaseSKILL,
124+
}).
125+
Add(skills.Bundled{
126+
Name: "manage-repo",
127+
Description: "Create repos, manage branches, and push file changes. Use when creating a new repository, making a branch, committing files via the API, forking a repo, or managing repository contents.",
128+
Content: skills.ManageRepoSKILL,
129+
}).
130+
Add(skills.Bundled{
131+
Name: "manage-labels",
132+
Description: "Set up and maintain a consistent label scheme. Use when creating labels, organizing a label system, cleaning up labels, or standardizing label naming across a repository.",
133+
Content: skills.ManageLabelsSKILL,
134+
}).
135+
Add(skills.Bundled{
136+
Name: "contribute-oss",
137+
Description: "Fork, branch, and submit PRs to external repositories. Use when contributing to open source, forking a repo to make changes, or submitting a pull request to a project you don't own.",
138+
Content: skills.ContributeOSSSKILL,
139+
}).
140+
Add(skills.Bundled{
141+
Name: "browse-discussions",
142+
Description: "Read and explore GitHub Discussions and categories. Use when browsing discussions, reading community conversations, checking discussion categories, or looking for answers in a project's discussions.",
143+
Content: skills.BrowseDiscussionsSKILL,
144+
}).
145+
Add(skills.Bundled{
146+
Name: "delegate-to-copilot",
147+
Description: "Assign Copilot to issues and request Copilot PR reviews. Use when you want Copilot to work on an issue, get an automated code review, or delegate tasks to GitHub Copilot.",
148+
Content: skills.DelegateToCopilotSKILL,
149+
}).
150+
Add(skills.Bundled{
151+
Name: "discover-github",
152+
Description: "Search for users, organizations, and repositories. Use when finding GitHub users, looking up organizations, discovering repos by topic or language, or managing your starred repositories.",
153+
Content: skills.DiscoverGitHubSKILL,
154+
}).
155+
Add(skills.Bundled{
156+
Name: "share-snippet",
157+
Description: "Create and manage code snippets via GitHub Gists. Use when sharing a code snippet, creating a quick paste, saving notes as a gist, or managing your existing gists.",
158+
Content: skills.ShareSnippetSKILL,
159+
}).
160+
// Meta-skill that teaches the model how to discover and load skills
161+
// from this server (both bundled and repo-hosted). Bridges the SEP's
162+
// discovery gap for autonomous agents. Always-on — the bundled-skill
163+
// discovery half is useful regardless of which toolsets are enabled;
164+
// the per-repo half (which depends on `list_repo_skills`) is gated
165+
// by a caveat in the SKILL.md body.
166+
Add(skills.Bundled{
167+
Name: "discover-mcp-skills",
168+
Description: "Discover and load Agent Skills (SKILL.md files) exposed by this MCP server — both the skills bundled with the server and skills hosted in any GitHub repository. Use when the user asks \"what skills do you have?\", \"what can you help with?\", \"use the skill from repo X\", \"are there skills for this in any repo?\", or whenever you suspect an unfamiliar workflow has an existing SKILL.md.",
169+
Content: skills.DiscoverMCPSkillsSKILL,
170+
}).
171+
// Per-repo skill template (SEP-2640 mcp-resource-template entry).
172+
// Gated on the `skills` toolset since the matching MCP resource
173+
// template is registered there too.
174+
AddTemplate(skills.BundledTemplate{
175+
Description: "Agent Skills hosted in any GitHub repository — fill in {owner}/{repo}/{skill_name} to read SKILL.md, then extend the URI to read referenced files (e.g. references/GUIDE.md).",
176+
URL: SkillResourceDiscoveryURL,
177+
Enabled: func() bool { return inv.IsToolsetEnabled(ToolsetMetadataSkills.ID) },
31178
})
32179
}
33180

0 commit comments

Comments
 (0)