@cyanheads/cyanheads-mcp-server 0.4.1 → 0.4.3
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 +56 -26
- package/CLAUDE.md +56 -26
- package/Dockerfile +38 -29
- package/README.md +59 -48
- package/changelog/0.4.x/0.4.2.md +32 -0
- package/changelog/0.4.x/0.4.3.md +34 -0
- package/changelog/template.md +9 -26
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/describe-entry.tool.d.ts +24 -0
- package/dist/mcp-server/tools/definitions/describe-entry.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/describe-entry.tool.js +120 -95
- package/dist/mcp-server/tools/definitions/describe-entry.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-catalog.tool.d.ts +12 -0
- package/dist/mcp-server/tools/definitions/search-catalog.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-catalog.tool.js +86 -20
- package/dist/mcp-server/tools/definitions/search-catalog.tool.js.map +1 -1
- package/dist/services/catalog/catalog-service.d.ts +2 -2
- package/dist/services/catalog/catalog-service.d.ts.map +1 -1
- package/dist/services/catalog/catalog-service.js +36 -11
- package/dist/services/catalog/catalog-service.js.map +1 -1
- package/dist/services/catalog/remote-catalog-provider.d.ts +2 -2
- package/dist/services/catalog/remote-catalog-provider.d.ts.map +1 -1
- package/dist/services/catalog/remote-catalog-provider.js +34 -5
- package/dist/services/catalog/remote-catalog-provider.js.map +1 -1
- package/dist/services/catalog/self-record.js +3 -3
- package/dist/services/catalog/service-instance.js +1 -1
- package/dist/services/catalog/service-instance.js.map +1 -1
- package/dist/services/catalog/types.d.ts +2 -2
- package/dist/services/catalog/types.d.ts.map +1 -1
- package/manifest.json +2 -2
- package/package.json +26 -14
- package/server.json +3 -3
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
9
9
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
10
|
+
import { markdown } from '@cyanheads/mcp-ts-core/utils';
|
|
10
11
|
import { getCatalogService } from '../../../services/catalog/service-instance.js';
|
|
11
12
|
import { buildAllSnippets } from '../../../services/catalog/snippets.js';
|
|
12
13
|
/**
|
|
@@ -19,7 +20,7 @@ const NAME_MAX_LENGTH = 64;
|
|
|
19
20
|
export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
20
21
|
title: 'Describe Fleet Tool or Server',
|
|
21
22
|
description: 'Return the description and install snippets for a named tool or server. For tools: the ' +
|
|
22
|
-
'description
|
|
23
|
+
'description, owning server, and connection metadata. For either kind: local (stdio, via npx) install ' +
|
|
23
24
|
'snippets for every published server, plus remote (HTTP) connection snippets when a hosted ' +
|
|
24
25
|
'endpoint exists — for every supported client, or one client via the client parameter.',
|
|
25
26
|
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
@@ -31,7 +32,7 @@ export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
|
31
32
|
.max(NAME_MAX_LENGTH)
|
|
32
33
|
.describe('Tool name (snake_case, e.g. "earthquake_search") or server name ' +
|
|
33
34
|
'(kebab-case, e.g. "earthquake-mcp-server"). 1-' +
|
|
34
|
-
`${NAME_MAX_LENGTH} characters. Use cyanheads_search_catalog to discover valid names.`),
|
|
35
|
+
`${NAME_MAX_LENGTH} characters. Exact names win; unique case-insensitive names resolve to canonical names. Use cyanheads_search_catalog to discover valid names.`),
|
|
35
36
|
kind: z
|
|
36
37
|
.enum(['tool', 'server'])
|
|
37
38
|
.optional()
|
|
@@ -49,15 +50,44 @@ export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
|
49
50
|
z
|
|
50
51
|
.object({
|
|
51
52
|
kind: z.literal('tool').describe('Resolved as a tool entry.'),
|
|
52
|
-
name: z.string().describe('
|
|
53
|
+
name: z.string().describe('Canonical resolved tool name.'),
|
|
53
54
|
description: z.string().describe('Brief description of what the tool does.'),
|
|
54
55
|
server: z.string().describe('Server package name that owns this tool.'),
|
|
56
|
+
npm: z.string().describe('Owning server npm package for local installation.'),
|
|
57
|
+
github: z.string().describe('Owning server GitHub repository URL.'),
|
|
58
|
+
endpoint: z
|
|
59
|
+
.string()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe('Owning server hosted HTTP endpoint, when available.'),
|
|
62
|
+
auth: z.string().describe('Owning server hosted authentication requirement.'),
|
|
63
|
+
requiredEnvVars: z
|
|
64
|
+
.array(z.string())
|
|
65
|
+
.optional()
|
|
66
|
+
.describe('Environment variable names required for local installation.'),
|
|
67
|
+
installNotice: z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Actionable guidance when the requested client has no compatible installation snippet.'),
|
|
71
|
+
installSnippets: z
|
|
72
|
+
.array(z
|
|
73
|
+
.object({
|
|
74
|
+
client: z
|
|
75
|
+
.enum(['claude-code', 'codex', 'cursor', 'curl', 'gemini', 'streamable-http'])
|
|
76
|
+
.describe('Target MCP client.'),
|
|
77
|
+
transport: z
|
|
78
|
+
.enum(['stdio', 'http'])
|
|
79
|
+
.describe('Local stdio or hosted HTTP transport.'),
|
|
80
|
+
label: z.string().describe('Install method label.'),
|
|
81
|
+
payload: z.string().describe('Install command or configuration.'),
|
|
82
|
+
})
|
|
83
|
+
.describe('An installation snippet for the owning server.'))
|
|
84
|
+
.describe('Owning server install snippets, filtered by client when supplied.'),
|
|
55
85
|
})
|
|
56
86
|
.describe('A resolved tool entry — its description and the server that owns it.'),
|
|
57
87
|
z
|
|
58
88
|
.object({
|
|
59
89
|
kind: z.literal('server').describe('Resolved as a server entry.'),
|
|
60
|
-
name: z.string().describe('
|
|
90
|
+
name: z.string().describe('Canonical resolved server name.'),
|
|
61
91
|
displayName: z.string().describe('Human-readable server label.'),
|
|
62
92
|
description: z.string().describe('Brief description of what the server does.'),
|
|
63
93
|
version: z.string().describe('Published version captured at fleet-generation time.'),
|
|
@@ -76,6 +106,10 @@ export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
|
76
106
|
.array(z.string())
|
|
77
107
|
.optional()
|
|
78
108
|
.describe('Env var names the local (stdio) install requires (e.g. ["MAILCHIMP_API_KEY"]). Absent when none.'),
|
|
109
|
+
installNotice: z
|
|
110
|
+
.string()
|
|
111
|
+
.optional()
|
|
112
|
+
.describe('Actionable guidance when the requested client has no compatible installation snippet.'),
|
|
79
113
|
toolCount: z.number().describe('Number of tools exposed by this server.'),
|
|
80
114
|
tools: z
|
|
81
115
|
.array(z
|
|
@@ -125,6 +159,10 @@ export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
|
125
159
|
when: 'Catalog has not finished loading.',
|
|
126
160
|
recovery: 'Retry in a few seconds; the catalog is still loading.',
|
|
127
161
|
retryable: true,
|
|
162
|
+
// Raised below the handler: getCatalogService() and CatalogService's own
|
|
163
|
+
// _assertInitialized() both throw serviceUnavailable with this reason, so
|
|
164
|
+
// no ctx.fail site here names it.
|
|
165
|
+
thrownBy: 'service',
|
|
128
166
|
},
|
|
129
167
|
],
|
|
130
168
|
// biome-ignore lint/suspicious/useAwait: handler has no I/O but must return a Promise for the framework
|
|
@@ -147,113 +185,100 @@ export const describeEntryTool = tool('cyanheads_describe_entry', {
|
|
|
147
185
|
// Ambiguity check (can happen if resolvedKind is undefined and name has neither _ nor -).
|
|
148
186
|
if (toolEntry && serverEntry) {
|
|
149
187
|
throw ctx.fail('ambiguous_kind', `"${input.name}" matches both a tool and a server`, {
|
|
150
|
-
...ctx.recoveryFor('ambiguous_kind'),
|
|
151
188
|
name: input.name,
|
|
152
189
|
});
|
|
153
190
|
}
|
|
191
|
+
const owner = toolEntry?.serverRecord ?? serverEntry;
|
|
192
|
+
if (!owner) {
|
|
193
|
+
throw ctx.fail('not_found', `No tool or server named "${input.name}" in the catalog`, {
|
|
194
|
+
name: input.name,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const allSnippets = buildAllSnippets(owner);
|
|
198
|
+
const snippets = input.client
|
|
199
|
+
? allSnippets.filter((s) => s.client === input.client)
|
|
200
|
+
: allSnippets;
|
|
201
|
+
const connection = {
|
|
202
|
+
npm: owner.npm,
|
|
203
|
+
github: owner.github,
|
|
204
|
+
...(owner.endpoint ? { endpoint: owner.endpoint } : {}),
|
|
205
|
+
auth: owner.auth,
|
|
206
|
+
...(owner.requiredEnvVars?.length ? { requiredEnvVars: owner.requiredEnvVars } : {}),
|
|
207
|
+
installSnippets: snippets,
|
|
208
|
+
...(input.client && snippets.length === 0
|
|
209
|
+
? {
|
|
210
|
+
installNotice: 'curl requires a hosted HTTP endpoint. This server supports local stdio installation; call cyanheads_describe_entry again with client "codex" for an install command.',
|
|
211
|
+
}
|
|
212
|
+
: {}),
|
|
213
|
+
};
|
|
154
214
|
if (toolEntry) {
|
|
155
215
|
return {
|
|
156
216
|
result: {
|
|
157
217
|
kind: 'tool',
|
|
158
|
-
name:
|
|
218
|
+
name: toolEntry.name,
|
|
159
219
|
description: toolEntry.description,
|
|
160
220
|
server: toolEntry.serverRecord.name,
|
|
221
|
+
...connection,
|
|
161
222
|
},
|
|
162
223
|
};
|
|
163
224
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
:
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
npm: serverEntry.npm,
|
|
177
|
-
github: serverEntry.github,
|
|
178
|
-
...(serverEntry.endpoint ? { endpoint: serverEntry.endpoint } : {}),
|
|
179
|
-
auth: serverEntry.auth,
|
|
180
|
-
...(serverEntry.requiredEnvVars?.length
|
|
181
|
-
? { requiredEnvVars: serverEntry.requiredEnvVars }
|
|
182
|
-
: {}),
|
|
183
|
-
toolCount: serverEntry.tools.length,
|
|
184
|
-
tools: serverEntry.tools.map((t) => ({ name: t.name, description: t.description })),
|
|
185
|
-
installSnippets: snippets,
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
throw ctx.fail('not_found', `No tool or server named "${input.name}" in the catalog`, {
|
|
190
|
-
...ctx.recoveryFor('not_found'),
|
|
191
|
-
name: input.name,
|
|
192
|
-
});
|
|
225
|
+
return {
|
|
226
|
+
result: {
|
|
227
|
+
kind: 'server',
|
|
228
|
+
name: owner.name,
|
|
229
|
+
displayName: owner.displayName,
|
|
230
|
+
description: owner.description,
|
|
231
|
+
version: owner.version,
|
|
232
|
+
...connection,
|
|
233
|
+
toolCount: owner.tools.length,
|
|
234
|
+
tools: owner.tools.map((t) => ({ name: t.name, description: t.description })),
|
|
235
|
+
},
|
|
236
|
+
};
|
|
193
237
|
},
|
|
194
238
|
format: ({ result }) => {
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
lines.push(`## Description`);
|
|
203
|
-
lines.push(result.description);
|
|
204
|
-
}
|
|
239
|
+
const md = markdown();
|
|
240
|
+
const label = (value) => /[\r\n]/u.test(value)
|
|
241
|
+
? `\n\n${markdown().codeBlock(value).build()}`
|
|
242
|
+
: markdown().inlineCode(value).build();
|
|
243
|
+
md.h1(`${result.kind === 'tool' ? 'Tool' : 'Server'}: ${label(result.name)}`).keyValue('Kind', result.kind);
|
|
244
|
+
if (result.kind === 'tool')
|
|
245
|
+
md.keyValue('Server', label(result.server));
|
|
205
246
|
else {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
lines.push('```');
|
|
240
|
-
lines.push('');
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (result.endpoint) {
|
|
244
|
-
lines.push('## Remote install (HTTP)');
|
|
245
|
-
lines.push(`**Endpoint:** ${result.endpoint}`);
|
|
246
|
-
lines.push('');
|
|
247
|
-
for (const snippet of remote) {
|
|
248
|
-
lines.push(`### ${snippet.label} (${snippet.client})`);
|
|
249
|
-
lines.push('```');
|
|
250
|
-
lines.push(snippet.payload);
|
|
251
|
-
lines.push('```');
|
|
252
|
-
lines.push('');
|
|
253
|
-
}
|
|
254
|
-
}
|
|
247
|
+
md.keyValue('Display name', label(result.displayName))
|
|
248
|
+
.keyValue('Version', label(result.version))
|
|
249
|
+
.keyValue('Tool count', result.toolCount);
|
|
250
|
+
}
|
|
251
|
+
md.keyValue('npm', label(result.npm))
|
|
252
|
+
.keyValue('GitHub', label(result.github))
|
|
253
|
+
.keyValue('Auth', label(result.auth))
|
|
254
|
+
.h2('Description')
|
|
255
|
+
.codeBlock(result.description);
|
|
256
|
+
if (result.kind === 'server' && result.tools.length) {
|
|
257
|
+
md.h2('Tools');
|
|
258
|
+
for (const entry of result.tools)
|
|
259
|
+
md.h3(label(entry.name)).codeBlock(entry.description);
|
|
260
|
+
}
|
|
261
|
+
if (result.requiredEnvVars?.length) {
|
|
262
|
+
md.h2('Required env vars');
|
|
263
|
+
for (const name of result.requiredEnvVars)
|
|
264
|
+
md.codeBlock(name);
|
|
265
|
+
md.paragraph('Set these environment variables before starting the local server.');
|
|
266
|
+
}
|
|
267
|
+
if (result.installNotice)
|
|
268
|
+
md.paragraph(result.installNotice);
|
|
269
|
+
const local = result.installSnippets.filter((s) => s.transport === 'stdio');
|
|
270
|
+
const remote = result.installSnippets.filter((s) => s.transport === 'http');
|
|
271
|
+
if (local.length) {
|
|
272
|
+
md.h2('Local install (stdio)');
|
|
273
|
+
for (const snippet of local)
|
|
274
|
+
md.h3(label(snippet.label)).keyValue('Client', snippet.client).codeBlock(snippet.payload);
|
|
275
|
+
}
|
|
276
|
+
if (result.endpoint) {
|
|
277
|
+
md.h2('Remote install (HTTP)').keyValue('Endpoint', label(result.endpoint));
|
|
278
|
+
for (const snippet of remote)
|
|
279
|
+
md.h3(label(snippet.label)).keyValue('Client', snippet.client).codeBlock(snippet.payload);
|
|
255
280
|
}
|
|
256
|
-
return [{ type: 'text', text:
|
|
281
|
+
return [{ type: 'text', text: md.build() }];
|
|
257
282
|
},
|
|
258
283
|
});
|
|
259
284
|
//# sourceMappingURL=describe-entry.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-entry.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/describe-entry.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,EAAE;IAChE,KAAK,EAAE,+BAA+B;IACtC,WAAW,EACT,yFAAyF;QACzF,
|
|
1
|
+
{"version":3,"file":"describe-entry.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/describe-entry.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,13 @@ export declare const searchCatalogTool: import("@cyanheads/mcp-ts-core").ToolDef
|
|
|
19
19
|
utility: "utility";
|
|
20
20
|
}>>;
|
|
21
21
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
serversOffset: z.ZodDefault<z.ZodNumber>;
|
|
22
24
|
}, z.core.$strip>, z.ZodObject<{
|
|
25
|
+
offset: z.ZodNumber;
|
|
26
|
+
nextOffset: z.ZodNullable<z.ZodNumber>;
|
|
27
|
+
serversOffset: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
nextServersOffset: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
23
29
|
results: z.ZodArray<z.ZodObject<{
|
|
24
30
|
name: z.ZodString;
|
|
25
31
|
server: z.ZodString;
|
|
@@ -50,11 +56,17 @@ export declare const searchCatalogTool: import("@cyanheads/mcp-ts-core").ToolDef
|
|
|
50
56
|
}, z.core.$strip>>>;
|
|
51
57
|
serversTotal: z.ZodOptional<z.ZodNumber>;
|
|
52
58
|
}, z.core.$strip>, readonly [{
|
|
59
|
+
readonly reason: "invalid_servers_offset";
|
|
60
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
61
|
+
readonly when: "A nonzero serversOffset is supplied in servers scope.";
|
|
62
|
+
readonly recovery: "Set serversOffset to zero in servers scope; use offset to page server results.";
|
|
63
|
+
}, {
|
|
53
64
|
readonly reason: "catalog_empty";
|
|
54
65
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
55
66
|
readonly when: "Catalog has not finished loading.";
|
|
56
67
|
readonly recovery: "Retry in a few seconds; the catalog is still loading.";
|
|
57
68
|
readonly retryable: true;
|
|
69
|
+
readonly thrownBy: "service";
|
|
58
70
|
}], {
|
|
59
71
|
readonly effectiveQuery: z.ZodString;
|
|
60
72
|
readonly totalCount: z.ZodNumber;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-catalog.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-catalog.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-catalog.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-catalog.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAYjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqS5B,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
8
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
9
|
+
import { markdown } from '@cyanheads/mcp-ts-core/utils';
|
|
9
10
|
import { getCatalogService } from '../../../services/catalog/service-instance.js';
|
|
10
11
|
/**
|
|
11
12
|
* Upper bound on the query string. A natural-language capability description
|
|
@@ -26,8 +27,9 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
26
27
|
.string()
|
|
27
28
|
.min(1)
|
|
28
29
|
.max(QUERY_MAX_LENGTH)
|
|
30
|
+
.regex(/\S/u, 'Query must contain a non-whitespace character.')
|
|
29
31
|
.describe('Natural language search query. Describe what you want to accomplish, a workflow, or a ' +
|
|
30
|
-
`capability area. 1-${QUERY_MAX_LENGTH} characters.`),
|
|
32
|
+
`capability area. 1-${QUERY_MAX_LENGTH} raw characters; surrounding whitespace is trimmed. Must contain non-whitespace text.`),
|
|
31
33
|
scope: z
|
|
32
34
|
.enum(['tools', 'servers'])
|
|
33
35
|
.default('tools')
|
|
@@ -43,8 +45,34 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
43
45
|
.max(20)
|
|
44
46
|
.default(5)
|
|
45
47
|
.describe('Maximum number of results to return (1-20). Default 5.'),
|
|
48
|
+
offset: z
|
|
49
|
+
.number()
|
|
50
|
+
.int()
|
|
51
|
+
.min(0)
|
|
52
|
+
.default(0)
|
|
53
|
+
.describe('Result offset. Use nextOffset with the same query, scope, category, and limit; pages use the current catalog.'),
|
|
54
|
+
serversOffset: z
|
|
55
|
+
.number()
|
|
56
|
+
.int()
|
|
57
|
+
.min(0)
|
|
58
|
+
.default(0)
|
|
59
|
+
.describe('Independent server roll-up offset (10 per page). Use nextServersOffset; must be zero in servers scope.'),
|
|
46
60
|
}),
|
|
47
61
|
output: z.object({
|
|
62
|
+
offset: z.number().describe('Current ranked-result offset.'),
|
|
63
|
+
nextOffset: z
|
|
64
|
+
.number()
|
|
65
|
+
.nullable()
|
|
66
|
+
.describe('Next ranked-result offset, or null when exhausted.'),
|
|
67
|
+
serversOffset: z
|
|
68
|
+
.number()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Current server roll-up offset; tools scope only.'),
|
|
71
|
+
nextServersOffset: z
|
|
72
|
+
.number()
|
|
73
|
+
.nullable()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe('Next server roll-up offset, or null when exhausted; tools scope only.'),
|
|
48
76
|
results: z
|
|
49
77
|
.array(z
|
|
50
78
|
.object({
|
|
@@ -82,7 +110,7 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
82
110
|
})
|
|
83
111
|
.describe('A server roll-up entry.'))
|
|
84
112
|
.optional()
|
|
85
|
-
.describe('
|
|
113
|
+
.describe('Server roll-up from the full match set, independent of result offset/limit. Tools scope only. Ordered by topScore desc (name-tiebroken); 10 per page starting at serversOffset. Use nextServersOffset to continue and serversTotal for the full distinct count.'),
|
|
86
114
|
serversTotal: z
|
|
87
115
|
.number()
|
|
88
116
|
.optional()
|
|
@@ -96,37 +124,59 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
96
124
|
notice: z
|
|
97
125
|
.string()
|
|
98
126
|
.optional()
|
|
99
|
-
.describe('Guidance
|
|
127
|
+
.describe('Guidance for zero matches or an exhausted result page. Absent on nonempty result pages.'),
|
|
100
128
|
},
|
|
101
129
|
errors: [
|
|
130
|
+
{
|
|
131
|
+
reason: 'invalid_servers_offset',
|
|
132
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
133
|
+
when: 'A nonzero serversOffset is supplied in servers scope.',
|
|
134
|
+
recovery: 'Set serversOffset to zero in servers scope; use offset to page server results.',
|
|
135
|
+
},
|
|
102
136
|
{
|
|
103
137
|
reason: 'catalog_empty',
|
|
104
138
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
105
139
|
when: 'Catalog has not finished loading.',
|
|
106
140
|
recovery: 'Retry in a few seconds; the catalog is still loading.',
|
|
107
141
|
retryable: true,
|
|
142
|
+
// Raised below the handler: getCatalogService() and CatalogService's own
|
|
143
|
+
// _assertInitialized() both throw serviceUnavailable with this reason, so
|
|
144
|
+
// no ctx.fail site here names it.
|
|
145
|
+
thrownBy: 'service',
|
|
108
146
|
},
|
|
109
147
|
],
|
|
110
148
|
async handler(input, ctx) {
|
|
149
|
+
if (input.scope === 'servers' && input.serversOffset !== 0) {
|
|
150
|
+
throw ctx.fail('invalid_servers_offset');
|
|
151
|
+
}
|
|
152
|
+
const query = input.query.trim();
|
|
111
153
|
ctx.log.info('Searching catalog', {
|
|
112
|
-
query
|
|
154
|
+
query,
|
|
113
155
|
scope: input.scope,
|
|
114
156
|
limit: input.limit,
|
|
115
157
|
});
|
|
116
158
|
const catalog = getCatalogService();
|
|
117
159
|
const allResults = await catalog.search({
|
|
118
|
-
query
|
|
160
|
+
query,
|
|
119
161
|
scope: input.scope,
|
|
120
162
|
...(input.category ? { category: input.category } : {}),
|
|
121
163
|
});
|
|
122
164
|
const totalMatched = allResults.length;
|
|
123
|
-
ctx.enrich.echo(
|
|
165
|
+
ctx.enrich.echo(query);
|
|
124
166
|
ctx.enrich.total(totalMatched);
|
|
125
167
|
if (totalMatched === 0) {
|
|
126
|
-
ctx.enrich.notice(`No ${input.scope} matched
|
|
127
|
-
|
|
168
|
+
ctx.enrich.notice(`No ${input.scope} matched. Try broadening the query${input.category ? ', removing the category filter,' : ''} or switching to scope "${input.scope === 'tools' ? 'servers' : 'tools'}".`);
|
|
169
|
+
}
|
|
170
|
+
else if (input.offset >= totalMatched) {
|
|
171
|
+
ctx.enrich.notice('No results on this page. Use offset 0 to return to the first result page.');
|
|
128
172
|
}
|
|
129
|
-
const results = allResults.slice(
|
|
173
|
+
const results = allResults.slice(input.offset, input.offset + input.limit);
|
|
174
|
+
const page = {
|
|
175
|
+
results,
|
|
176
|
+
scope: input.scope,
|
|
177
|
+
offset: input.offset,
|
|
178
|
+
nextOffset: input.offset + results.length < totalMatched ? input.offset + results.length : null,
|
|
179
|
+
};
|
|
130
180
|
ctx.log.info('Search complete', { totalMatched, returned: results.length });
|
|
131
181
|
if (input.scope === 'tools') {
|
|
132
182
|
// Build server roll-up from the full match set (before limit slice)
|
|
@@ -146,7 +196,7 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
146
196
|
const serversTotal = serverMap.size;
|
|
147
197
|
const servers = Array.from(serverMap.entries())
|
|
148
198
|
.sort(([nameA, a], [nameB, b]) => b.topScore - a.topScore || nameA.localeCompare(nameB))
|
|
149
|
-
.slice(
|
|
199
|
+
.slice(input.serversOffset, input.serversOffset + SERVERS_CAP)
|
|
150
200
|
.map(([name, agg]) => {
|
|
151
201
|
const record = catalog.getServer(name);
|
|
152
202
|
return {
|
|
@@ -157,32 +207,48 @@ export const searchCatalogTool = tool('cyanheads_search_catalog', {
|
|
|
157
207
|
topScore: agg.topScore,
|
|
158
208
|
};
|
|
159
209
|
});
|
|
160
|
-
return {
|
|
210
|
+
return {
|
|
211
|
+
...page,
|
|
212
|
+
servers,
|
|
213
|
+
serversTotal,
|
|
214
|
+
serversOffset: input.serversOffset,
|
|
215
|
+
nextServersOffset: input.serversOffset + servers.length < serversTotal
|
|
216
|
+
? input.serversOffset + servers.length
|
|
217
|
+
: null,
|
|
218
|
+
};
|
|
161
219
|
}
|
|
162
|
-
return
|
|
220
|
+
return page;
|
|
163
221
|
},
|
|
164
222
|
format: (result) => {
|
|
165
|
-
const
|
|
223
|
+
const label = (value) => /[\r\n]/u.test(value)
|
|
224
|
+
? `\n\n${markdown().codeBlock(value).build()}`
|
|
225
|
+
: markdown().inlineCode(value).build();
|
|
226
|
+
const lines = [
|
|
227
|
+
`**Scope:** ${result.scope}`,
|
|
228
|
+
`offset: ${result.offset}; nextOffset: ${result.nextOffset}`,
|
|
229
|
+
'',
|
|
230
|
+
];
|
|
166
231
|
if (result.results.length === 0) {
|
|
167
|
-
lines.push('No results matched.');
|
|
232
|
+
lines.push(result.offset > 0 ? 'No results on this page.' : 'No results matched.');
|
|
168
233
|
}
|
|
169
234
|
else {
|
|
170
235
|
for (const item of result.results) {
|
|
171
|
-
lines.push(`### ${item.name}`);
|
|
172
|
-
lines.push(`**Server:** ${item.server}
|
|
173
|
-
lines.push(item.brief);
|
|
236
|
+
lines.push(`### ${label(item.name)}`);
|
|
237
|
+
lines.push(`**Server:** ${label(item.server)}\n\n**Category:** ${item.category} | **Score:** ${item.score.toFixed(3)}`);
|
|
238
|
+
lines.push(markdown().codeBlock(item.brief).build());
|
|
174
239
|
lines.push('');
|
|
175
240
|
}
|
|
176
241
|
}
|
|
177
|
-
if (result.servers
|
|
242
|
+
if (result.servers) {
|
|
243
|
+
lines.push(`serversOffset: ${result.serversOffset}; nextServersOffset: ${result.nextServersOffset}`);
|
|
178
244
|
const cap = result.servers.length;
|
|
179
245
|
const total = result.serversTotal ?? cap;
|
|
180
246
|
const header = total > cap ? `## Servers (showing ${cap} of ${total})` : '## Servers';
|
|
181
247
|
lines.push(header);
|
|
182
248
|
lines.push('');
|
|
183
249
|
for (const s of result.servers) {
|
|
184
|
-
lines.push(
|
|
185
|
-
lines.push(s.brief);
|
|
250
|
+
lines.push(`${label(s.name)}\n\n(${s.category}) — ${s.matchedTools} matched tool${s.matchedTools === 1 ? '' : 's'}, top score ${s.topScore.toFixed(3)}`);
|
|
251
|
+
lines.push(markdown().codeBlock(s.brief).build());
|
|
186
252
|
lines.push('');
|
|
187
253
|
}
|
|
188
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-catalog.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-catalog.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,EAAE;IAChE,KAAK,EAAE,gCAAgC;IACvC,WAAW,EACT,8FAA8F;QAC9F,yFAAyF;QACzF,kFAAkF;IACpF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IACzD,IAAI,EAAE,CAAC,oCAAoC,CAAC;IAE5C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,gBAAgB,CAAC;aACrB,QAAQ,CACP,wFAAwF;YACtF,sBAAsB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"search-catalog.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-catalog.tool.ts"],"names":[],"mappings":"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"}
|