@oss-scout/mcp 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tools.js CHANGED
@@ -18,7 +18,15 @@ export function registerTools(server, scout) {
18
18
  .string()
19
19
  .optional()
20
20
  .describe("Comma-separated search strategies: merged, starred, broad, maintained, all"),
21
- }, async ({ maxResults, strategies }) => {
21
+ preferLanguages: z
22
+ .array(z.string())
23
+ .optional()
24
+ .describe("Soft-boost ranking for candidates whose repo language matches one of these (case-insensitive). Personalization tier between recommendation and viabilityScore (#1244). Not a filter; only reorders."),
25
+ preferRepos: z
26
+ .array(z.string())
27
+ .optional()
28
+ .describe("Soft-boost ranking for candidates in one of these `owner/repo` slugs. Stronger weight than language match (#1244). Not a filter; only reorders."),
29
+ }, async ({ maxResults, strategies, preferLanguages, preferRepos }) => {
22
30
  try {
23
31
  const parsedStrategies = strategies
24
32
  ? strategies
@@ -28,6 +36,8 @@ export function registerTools(server, scout) {
28
36
  const result = await withTimeout(scout.search({
29
37
  maxResults: maxResults ?? 10,
30
38
  strategies: parsedStrategies,
39
+ preferLanguages,
40
+ preferRepos,
31
41
  }));
32
42
  scout.saveResults(result.candidates);
33
43
  await scout.checkpoint();
@@ -43,6 +53,45 @@ export function registerTools(server, scout) {
43
53
  };
44
54
  }
45
55
  });
56
+ server.tool("scout-features", "Surface feature-scoped contribution opportunities in repos where you have 3+ merged PRs", {
57
+ maxResults: z
58
+ .number()
59
+ .optional()
60
+ .describe("Maximum number of results to return (default 10)"),
61
+ anchorThreshold: z
62
+ .number()
63
+ .int()
64
+ .min(1)
65
+ .max(50)
66
+ .optional()
67
+ .describe("Anchor threshold override (default 3)"),
68
+ splitRatio: z
69
+ .number()
70
+ .min(0)
71
+ .max(1)
72
+ .optional()
73
+ .describe("Quick-wins/bigger-bets split ratio (default 0.6)"),
74
+ }, async ({ maxResults, anchorThreshold, splitRatio }) => {
75
+ try {
76
+ const result = await withTimeout(scout.features({
77
+ count: maxResults ?? 10,
78
+ anchorThreshold,
79
+ splitRatio,
80
+ }));
81
+ scout.saveResults([...result.quickWins, ...result.biggerBets]);
82
+ await scout.checkpoint();
83
+ return {
84
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
85
+ };
86
+ }
87
+ catch (err) {
88
+ const msg = err instanceof Error ? err.message : String(err);
89
+ return {
90
+ content: [{ type: "text", text: `Error: ${msg}` }],
91
+ isError: true,
92
+ };
93
+ }
94
+ });
46
95
  server.tool("vet", "Vet a specific GitHub issue for contribution viability", {
47
96
  issueUrl: z
48
97
  .string()
@@ -184,6 +233,8 @@ export function registerTools(server, scout) {
184
233
  "interPhaseDelayMs",
185
234
  "broadPhaseDelayMs",
186
235
  "skipBroadWhenSufficientResults",
236
+ "featuresAnchorThreshold",
237
+ "featuresSplitRatio",
187
238
  ]);
188
239
  const BOOLEAN_KEYS = new Set(["includeDocIssues"]);
189
240
  server.tool("config-set", "Update an oss-scout configuration preference", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oss-scout/mcp",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "MCP server for oss-scout — exposes issue discovery and vetting as MCP tools",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "@modelcontextprotocol/sdk": "^1.27.1",
20
20
  "zod": "^4.3.6",
21
- "@oss-scout/core": "^0.5.0"
21
+ "@oss-scout/core": "^0.10.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^25.5.0",