Skip to content

Commit f20b4e3

Browse files
refactor: add isCompletable type guard for cleaner usage
Encapsulates the type checking logic in a dedicated type guard function, making the code more readable and maintainable compared to verbose inline type assertions. The type guard properly narrows the TypeScript type to CompletableSchema<T>, allowing direct access to _def.complete without additional casting.
1 parent d22ef6e commit f20b4e3

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/server/completable.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ export interface CompletableDef<T extends ZodTypeAny = ZodTypeAny> {
2222
*/
2323
export type CompletableSchema<T extends ZodTypeAny> = T & { _def: T['_def'] & CompletableDef<T> };
2424

25+
/**
26+
* Type guard to check if a schema has been wrapped with completion capabilities.
27+
*/
28+
export function isCompletable<T extends ZodTypeAny>(schema: ZodTypeAny): schema is CompletableSchema<T> {
29+
const defLike = (schema as any)._def;
30+
return defLike?.typeName === McpZodTypeKind.Completable;
31+
}
32+
2533
/**
2634
* Wraps a Zod type to provide autocompletion capabilities. Useful for, e.g., prompt arguments in MCP.
2735
*

src/server/mcp.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
ToolAnnotations,
3333
LoggingMessageNotification
3434
} from '../types.js';
35-
import { CompletableDef, McpZodTypeKind } from './completable.js';
35+
import { CompletableDef, isCompletable } from './completable.js';
3636
import { UriTemplate, Variables } from '../shared/uriTemplate.js';
3737
import { RequestHandlerExtra } from '../shared/protocol.js';
3838
import { Transport } from '../shared/transport.js';
@@ -238,13 +238,11 @@ export class McpServer {
238238
}
239239

240240
const field = prompt.argsSchema.shape[request.params.argument.name];
241-
const defLike = (field as unknown as { _def?: { typeName?: unknown } })._def;
242-
if (!defLike || defLike.typeName !== McpZodTypeKind.Completable) {
241+
if (!isCompletable<ZodString>(field)) {
243242
return EMPTY_COMPLETION_RESULT;
244243
}
245244

246-
const def: CompletableDef<ZodString> = (field as unknown as { _def: CompletableDef<ZodString> })._def;
247-
const suggestions = await def.complete(request.params.argument.value, request.params.context);
245+
const suggestions = await field._def.complete(request.params.argument.value, request.params.context);
248246
return createCompletionResult(suggestions);
249247
}
250248

0 commit comments

Comments
 (0)