@cyanheads/cyanheads-mcp-server 0.1.8 → 0.2.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/AGENTS.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** cyanheads-mcp-server
4
- **Version:** 0.1.8
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.11`
4
+ **Version:** 0.2.0
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.16`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
8
  **Zod:** ^4.4.3
@@ -300,14 +300,26 @@ When you complete a skill's checklist, check the boxes and add a completion time
300
300
  | `npm run rebuild` | Clean + build |
301
301
  | `npm run clean` | Remove build artifacts |
302
302
  | `npm run devcheck` | Lint + format + typecheck + security + changelog sync |
303
- | `bun run audit:refresh` | Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
303
+ | `bun run audit:refresh` | Delete `bun.lock`, reinstall, and re-run `bun audit`. Use when `devcheck` flags a transitive advisory — Bun's `update` is sticky on transitive resolutions, so the advisory may be a stale-lockfile false positive. If it survives the refresh, it's real. |
304
304
  | `npm run tree` | Generate directory structure doc |
305
- | `npm run format` | Auto-fix formatting |
305
+ | `npm run format` | Auto-fix formatting (safe fixes only) |
306
+ | `npm run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |
306
307
  | `npm test` | Run tests |
307
308
  | `npm run start:stdio` | Production mode (stdio) |
308
309
  | `npm run start:http` | Production mode (HTTP) |
309
310
  | `npm run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |
310
311
  | `npm run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
312
+ | `npm run bundle` | Build and pack as `.mcpb` for one-click Claude Desktop install |
313
+
314
+ ---
315
+
316
+ ## Bundling
317
+
318
+ `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
319
+
320
+ **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
321
+
322
+ **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
311
323
 
312
324
  ---
313
325
 
@@ -364,4 +376,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
364
376
  - [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
365
377
  - [ ] Registered in `createApp()` arrays (directly or via barrel exports)
366
378
  - [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
379
+ - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = package name; `interface.shortDescription` from `package.json` description
380
+ - [ ] `.codex-plugin/mcp.json` updated — server name key matches `package.json` name; env vars added for any required API keys
381
+ - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry with server name key, env vars for any required API keys
367
382
  - [ ] `npm run devcheck` passes
package/CLAUDE.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** cyanheads-mcp-server
4
- **Version:** 0.1.8
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.11`
4
+ **Version:** 0.2.0
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.16`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
8
  **Zod:** ^4.4.3
@@ -300,14 +300,26 @@ When you complete a skill's checklist, check the boxes and add a completion time
300
300
  | `npm run rebuild` | Clean + build |
301
301
  | `npm run clean` | Remove build artifacts |
302
302
  | `npm run devcheck` | Lint + format + typecheck + security + changelog sync |
303
- | `bun run audit:refresh` | Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
303
+ | `bun run audit:refresh` | Delete `bun.lock`, reinstall, and re-run `bun audit`. Use when `devcheck` flags a transitive advisory — Bun's `update` is sticky on transitive resolutions, so the advisory may be a stale-lockfile false positive. If it survives the refresh, it's real. |
304
304
  | `npm run tree` | Generate directory structure doc |
305
- | `npm run format` | Auto-fix formatting |
305
+ | `npm run format` | Auto-fix formatting (safe fixes only) |
306
+ | `npm run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |
306
307
  | `npm test` | Run tests |
307
308
  | `npm run start:stdio` | Production mode (stdio) |
308
309
  | `npm run start:http` | Production mode (HTTP) |
309
310
  | `npm run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |
310
311
  | `npm run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
312
+ | `npm run bundle` | Build and pack as `.mcpb` for one-click Claude Desktop install |
313
+
314
+ ---
315
+
316
+ ## Bundling
317
+
318
+ `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
319
+
320
+ **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
321
+
322
+ **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
311
323
 
312
324
  ---
313
325
 
@@ -364,4 +376,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
364
376
  - [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
365
377
  - [ ] Registered in `createApp()` arrays (directly or via barrel exports)
366
378
  - [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
379
+ - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = package name; `interface.shortDescription` from `package.json` description
380
+ - [ ] `.codex-plugin/mcp.json` updated — server name key matches `package.json` name; env vars added for any required API keys
381
+ - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry with server name key, env vars for any required API keys
367
382
  - [ ] `npm run devcheck` passes
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.1.8-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/cyanheads-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/cyanheads-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/cyanheads-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^5.9.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-%3E=1.3.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.2.0-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/cyanheads-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/cyanheads-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/cyanheads-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-%3E=1.3.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -0,0 +1,13 @@
1
+ ---
2
+ summary: "cyanheads_search enrichment — query echo, true total, and empty-result guidance in a typed enrichment block reaching both structuredContent and content[]; structuredContent keys totalMatched→totalCount and query→effectiveQuery"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.1.9 — 2026-05-30
8
+
9
+ ## Changed
10
+
11
+ - **`cyanheads_search` enrichment adoption.** Query echo, true match total, and empty-result guidance now surface in a typed `enrichment` block that reaches both the `structuredContent` JSON and the `content[]` markdown trailer. Both channels carry the same data; clients that read either surface now see the context.
12
+ - **`structuredContent` key renames.** `totalMatched` → `totalCount` (now in `enrichment`); `query` → `effectiveQuery` (now in `enrichment`). Values and presence semantics are unchanged — keys moved out of the domain return and into the enrichment block.
13
+ - **`@cyanheads/mcp-ts-core` `^0.9.11` → `^0.9.16`.** Framework adoption: `ctx.enrich` API, `getEnrichment` test helper, enrichment contract on `tool()`, plus dev-dep bumps (`@biomejs/biome`, `@types/node`, `tsc-alias`, `tsx`, `typescript ^6.0.3`, `vitest`).
@@ -0,0 +1,19 @@
1
+ ---
2
+ summary: "cyanheads_search servers roll-up (scope tools), structured-empty on zero matches, and .mcpbignore root-anchor fix"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.2.0 — 2026-05-30
8
+
9
+ ## Added
10
+
11
+ - **`cyanheads_search` servers roll-up** (scope `tools`). The response now includes a `servers` array built from the full match set before the limit slice — each entry carries `name`, `brief`, `category`, `matchedTools` (count of this server's tools in the match set), and `topScore` (best per-tool cosine). Ordered by `topScore` desc (name-tiebroken), capped at 10. `serversTotal` surfaces the true distinct-server count when the cap fires. Absent for scope `servers`. ([#4](https://github.com/cyanheads/cyanheads-mcp-server/issues/4))
12
+
13
+ ## Changed
14
+
15
+ - **`cyanheads_search` zero-match path.** Returns `{ results: [], scope }` with enrichment populated (`effectiveQuery`, `totalCount: 0`, recovery `notice`) instead of throwing `no_results`. The `no_results` reason is removed from the tool's `errors[]` contract. Aligns the zero-match path with the rest of the fleet's search tools — agents no longer take an error round-trip on a valid empty query. ([#3](https://github.com/cyanheads/cyanheads-mcp-server/issues/3))
16
+
17
+ ## Fixed
18
+
19
+ - **`.mcpbignore` directory excludes anchored to repo root.** Bare directory names (`src/`, `tests/`, `scripts/`, `skills/`, `docs/`, `coverage/`, `changelog/`, `announcements/`, `schemas/`) were unanchored and recursively matched inside `node_modules/`, stripping `@opentelemetry/api/build/src/` from the bundle (bundled server crashed on load). Prefixed with `/` to anchor to root. ([#2](https://github.com/cyanheads/cyanheads-mcp-server/issues/2))
@@ -43,7 +43,7 @@ security: false
43
43
  name the symbol, state what changed, stop. Use a second sentence only when
44
44
  it carries weight. If a bullet feels long, it is.
45
45
 
46
- Cut: mechanism walkthroughs (those belong in JSDoc, AGENTS.md, or the
46
+ Cut: mechanism walkthroughs (those belong in JSDoc, CLAUDE.md/AGENTS.md, or the
47
47
  relevant skill), ceremonial framings ("This release introduces…",
48
48
  backwards-compat paragraphs), file-by-file test enumerations, internal
49
49
  implementation notes. Prefer code/symbol names over English re-explanations.
@@ -67,5 +67,5 @@ export declare const describeTool: import("@cyanheads/mcp-ts-core").ToolDefiniti
67
67
  readonly when: "Catalog has not finished loading.";
68
68
  readonly recovery: "Retry in a few seconds; the catalog is still loading.";
69
69
  readonly retryable: true;
70
- }]>;
70
+ }], undefined>;
71
71
  //# sourceMappingURL=describe.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"describe.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/describe.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8MvB,CAAC"}
1
+ {"version":3,"file":"describe.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/describe.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8MvB,CAAC"}
@@ -32,22 +32,32 @@ export declare const searchTool: import("@cyanheads/mcp-ts-core").ToolDefinition
32
32
  }>;
33
33
  score: z.ZodNumber;
34
34
  }, z.core.$strip>>;
35
- totalMatched: z.ZodNumber;
36
- query: z.ZodString;
37
35
  scope: z.ZodEnum<{
38
36
  tools: "tools";
39
37
  servers: "servers";
40
38
  }>;
39
+ servers: z.ZodOptional<z.ZodArray<z.ZodObject<{
40
+ name: z.ZodString;
41
+ brief: z.ZodString;
42
+ category: z.ZodEnum<{
43
+ research: "research";
44
+ government: "government";
45
+ "public-data": "public-data";
46
+ utility: "utility";
47
+ }>;
48
+ matchedTools: z.ZodNumber;
49
+ topScore: z.ZodNumber;
50
+ }, z.core.$strip>>>;
51
+ serversTotal: z.ZodOptional<z.ZodNumber>;
41
52
  }, z.core.$strip>, readonly [{
42
- readonly reason: "no_results";
43
- readonly code: JsonRpcErrorCode.NotFound;
44
- readonly when: "Query produced no relevant matches.";
45
- readonly recovery: "Broaden the query, remove the category filter, or try scope \"servers\" to find the right server first.";
46
- }, {
47
53
  readonly reason: "catalog_empty";
48
54
  readonly code: JsonRpcErrorCode.ServiceUnavailable;
49
55
  readonly when: "Catalog has not finished loading.";
50
56
  readonly recovery: "Retry in a few seconds; the catalog is still loading.";
51
57
  readonly retryable: true;
52
- }]>;
58
+ }], {
59
+ readonly effectiveQuery: z.ZodString;
60
+ readonly totalCount: z.ZodNumber;
61
+ readonly notice: z.ZodOptional<z.ZodString>;
62
+ }>;
53
63
  //# sourceMappingURL=search.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0IrB,CAAC"}
1
+ {"version":3,"file":"search.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyNrB,CAAC"}
@@ -56,17 +56,41 @@ export const searchTool = tool('cyanheads_search', {
56
56
  })
57
57
  .describe('A single search result entry.'))
58
58
  .describe('Ranked matches, best first.'),
59
- totalMatched: z.number().describe('Total relevant matches before the limit was applied.'),
60
- query: z.string().describe('The query that was searched.'),
61
59
  scope: z.enum(['tools', 'servers']).describe('Scope that was searched.'),
60
+ servers: z
61
+ .array(z
62
+ .object({
63
+ name: z.string().describe('Server package name (e.g. "cdc-health-mcp-server").'),
64
+ brief: z.string().describe('One-line description of what the server does.'),
65
+ category: z
66
+ .enum(['research', 'government', 'public-data', 'utility'])
67
+ .describe('Catalog category.'),
68
+ matchedTools: z
69
+ .number()
70
+ .describe("Count of this server's tools in the full match set."),
71
+ topScore: z
72
+ .number()
73
+ .describe('Best cosine similarity among this server\'s matched tools. Drives ordering. Distinct from the score a server gets under scope "servers".'),
74
+ })
75
+ .describe('A server roll-up entry.'))
76
+ .optional()
77
+ .describe('Roll-up of distinct servers across the full match set, before the limit slice. Present only for scope "tools". Ordered by topScore desc (name-tiebroken); capped at 10. Use serversTotal to see how many distinct servers matched in total.'),
78
+ serversTotal: z
79
+ .number()
80
+ .optional()
81
+ .describe('Total distinct servers in the full match set (before the cap of 10 is applied). Present only when servers is present.'),
62
82
  }),
83
+ // Agent-facing search context — query echo, total count, empty-result guidance.
84
+ // Reaches both structuredContent and content[] trailer; never in the domain return.
85
+ enrichment: {
86
+ effectiveQuery: z.string().describe('The query that was searched.'),
87
+ totalCount: z.number().describe('Total relevant matches before the limit was applied.'),
88
+ notice: z
89
+ .string()
90
+ .optional()
91
+ .describe('Guidance when no results matched — e.g. how to broaden the query or try a different scope. Absent on successful result pages.'),
92
+ },
63
93
  errors: [
64
- {
65
- reason: 'no_results',
66
- code: JsonRpcErrorCode.NotFound,
67
- when: 'Query produced no relevant matches.',
68
- recovery: 'Broaden the query, remove the category filter, or try scope "servers" to find the right server first.',
69
- },
70
94
  {
71
95
  reason: 'catalog_empty',
72
96
  code: JsonRpcErrorCode.ServiceUnavailable,
@@ -88,34 +112,71 @@ export const searchTool = tool('cyanheads_search', {
88
112
  ...(input.category ? { category: input.category } : {}),
89
113
  });
90
114
  const totalMatched = allResults.length;
115
+ ctx.enrich.echo(input.query);
116
+ ctx.enrich.total(totalMatched);
91
117
  if (totalMatched === 0) {
92
- throw ctx.fail('no_results', `No ${input.scope} matched "${input.query}"`, {
93
- ...ctx.recoveryFor('no_results'),
94
- query: input.query,
95
- scope: input.scope,
96
- category: input.category,
97
- });
118
+ ctx.enrich.notice(`No ${input.scope} matched "${input.query}". Try broadening the query${input.category ? ', removing the category filter,' : ''} or switching to scope "${input.scope === 'tools' ? 'servers' : 'tools'}".`);
119
+ return { results: [], scope: input.scope };
98
120
  }
99
121
  const results = allResults.slice(0, input.limit);
100
122
  ctx.log.info('Search complete', { totalMatched, returned: results.length });
101
- return {
102
- results,
103
- totalMatched,
104
- query: input.query,
105
- scope: input.scope,
106
- };
123
+ if (input.scope === 'tools') {
124
+ // Build server roll-up from the full match set (before limit slice)
125
+ const SERVERS_CAP = 10;
126
+ const serverMap = new Map();
127
+ for (const r of allResults) {
128
+ const existing = serverMap.get(r.server);
129
+ if (existing) {
130
+ existing.matchedTools++;
131
+ if (r.score > existing.topScore)
132
+ existing.topScore = r.score;
133
+ }
134
+ else {
135
+ serverMap.set(r.server, { matchedTools: 1, topScore: r.score });
136
+ }
137
+ }
138
+ const serversTotal = serverMap.size;
139
+ const servers = Array.from(serverMap.entries())
140
+ .sort(([nameA, a], [nameB, b]) => b.topScore - a.topScore || nameA.localeCompare(nameB))
141
+ .slice(0, SERVERS_CAP)
142
+ .map(([name, agg]) => {
143
+ const record = catalog.getServer(name);
144
+ return {
145
+ name,
146
+ brief: record?.description ?? '',
147
+ category: record?.category ?? 'utility',
148
+ matchedTools: agg.matchedTools,
149
+ topScore: agg.topScore,
150
+ };
151
+ });
152
+ return { results, scope: input.scope, servers, serversTotal };
153
+ }
154
+ return { results, scope: input.scope };
107
155
  },
108
156
  format: (result) => {
109
- const lines = [
110
- `**Query:** ${result.query} **Scope:** ${result.scope}`,
111
- `**Matched:** ${result.totalMatched} total, showing ${result.results.length}`,
112
- '',
113
- ];
114
- for (const item of result.results) {
115
- lines.push(`### ${item.name}`);
116
- lines.push(`**Server:** ${item.server} | **Category:** ${item.category} | **Score:** ${item.score.toFixed(3)}`);
117
- lines.push(item.brief);
157
+ const lines = [`**Scope:** ${result.scope}`, ''];
158
+ if (result.results.length === 0) {
159
+ lines.push('No results matched.');
160
+ }
161
+ else {
162
+ for (const item of result.results) {
163
+ lines.push(`### ${item.name}`);
164
+ lines.push(`**Server:** ${item.server} | **Category:** ${item.category} | **Score:** ${item.score.toFixed(3)}`);
165
+ lines.push(item.brief);
166
+ lines.push('');
167
+ }
168
+ }
169
+ if (result.servers && result.servers.length > 0) {
170
+ const cap = result.servers.length;
171
+ const total = result.serversTotal ?? cap;
172
+ const header = total > cap ? `## Servers (showing ${cap} of ${total})` : '## Servers';
173
+ lines.push(header);
118
174
  lines.push('');
175
+ for (const s of result.servers) {
176
+ lines.push(`**${s.name}** (${s.category}) — ${s.matchedTools} matched tool${s.matchedTools === 1 ? '' : 's'}, top score ${s.topScore.toFixed(3)}`);
177
+ lines.push(s.brief);
178
+ lines.push('');
179
+ }
119
180
  }
120
181
  return [{ type: 'text', text: lines.join('\n') }];
121
182
  },
@@ -1 +1 @@
1
- {"version":3,"file":"search.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search.tool.ts"],"names":[],"mappings":"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"}
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": "0.3",
3
3
  "name": "cyanheads-mcp-server",
4
- "version": "0.1.8",
4
+ "version": "0.2.0",
5
5
  "description": "Fleet discovery for the cyanheads MCP ecosystem — semantic search + install snippets.",
6
6
  "author": { "name": "cyanheads" },
7
7
  "repository": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cyanheads/cyanheads-mcp-server",
3
3
  "mcpName": "io.github.cyanheads/cyanheads-mcp-server",
4
- "version": "0.1.8",
4
+ "version": "0.2.0",
5
5
  "description": "Fleet discovery for the cyanheads MCP ecosystem — semantic search + install snippets.",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -33,7 +33,8 @@
33
33
  "audit:refresh": "rm -f bun.lock && bun install && bun audit",
34
34
  "tree": "tsx scripts/tree.ts",
35
35
  "list-skills": "tsx scripts/list-skills.ts",
36
- "format": "biome check --write --unsafe .",
36
+ "format": "biome check --write .",
37
+ "format:unsafe": "biome check --write --unsafe .",
37
38
  "lint:mcp": "tsx scripts/lint-mcp.ts",
38
39
  "lint:packaging": "tsx scripts/lint-packaging.ts",
39
40
  "bundle": "tsx scripts/build.ts && npx -y @anthropic-ai/mcpb pack . dist/cyanheads-mcp-server.mcpb",
@@ -69,19 +70,19 @@
69
70
  "access": "public"
70
71
  },
71
72
  "dependencies": {
72
- "@cyanheads/mcp-ts-core": "^0.9.11",
73
+ "@cyanheads/mcp-ts-core": "^0.9.16",
73
74
  "@huggingface/transformers": "4.2.0",
74
75
  "pino-pretty": "^13.1.3",
75
76
  "zod": "^4.4.3"
76
77
  },
77
78
  "devDependencies": {
78
- "@biomejs/biome": "^2.4.7",
79
- "@types/node": "^25.6.0",
79
+ "@biomejs/biome": "^2.4.16",
80
+ "@types/node": "^25.9.1",
80
81
  "depcheck": "^1.4.7",
81
82
  "ignore": "^7.0.5",
82
- "tsc-alias": "^1.8.16",
83
- "tsx": "^4.19.0",
84
- "typescript": "^5.9.3",
85
- "vitest": "^4.1.0"
83
+ "tsc-alias": "^1.8.17",
84
+ "tsx": "^4.22.3",
85
+ "typescript": "^6.0.3",
86
+ "vitest": "^4.1.7"
86
87
  }
87
88
  }
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/cyanheads/cyanheads-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.1.8",
9
+ "version": "0.2.0",
10
10
  "remotes": [
11
11
  {
12
12
  "type": "streamable-http",
@@ -19,7 +19,7 @@
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/cyanheads-mcp-server",
21
21
  "runtimeHint": "node",
22
- "version": "0.1.8",
22
+ "version": "0.2.0",
23
23
  "packageArguments": [
24
24
  { "type": "positional", "value": "run" },
25
25
  { "type": "positional", "value": "start:stdio" }
@@ -68,7 +68,7 @@
68
68
  "registryBaseUrl": "https://registry.npmjs.org",
69
69
  "identifier": "@cyanheads/cyanheads-mcp-server",
70
70
  "runtimeHint": "node",
71
- "version": "0.1.8",
71
+ "version": "0.2.0",
72
72
  "packageArguments": [
73
73
  { "type": "positional", "value": "run" },
74
74
  { "type": "positional", "value": "start:http" }