Skip to content

Commit 5ddfa0a

Browse files
committed
Add extra to resource request handlers
1 parent f090c93 commit 5ddfa0a

File tree

2 files changed

+62
-44
lines changed

2 files changed

+62
-44
lines changed

src/server/index.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,10 @@ describe("ResourceTemplate", () => {
576576
const template = new ResourceTemplate("test://{id}", listCallback);
577577
expect(template.listCallback).toBe(listCallback);
578578

579-
const result = await template.listCallback?.();
579+
const abortController = new AbortController();
580+
const result = await template.listCallback?.({
581+
signal: abortController.signal,
582+
});
580583
expect(result?.resources).toHaveLength(1);
581584
expect(listCallback).toHaveBeenCalled();
582585
});

src/server/index.ts

Lines changed: 58 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -496,32 +496,37 @@ export class Server<
496496
resources: {},
497497
});
498498

499-
this.setRequestHandler(ListResourcesRequestSchema, async () => {
500-
const resources = Object.entries(this._registeredResources).map(
501-
([uri, resource]) => ({
502-
uri,
503-
name: resource.name,
504-
...resource.metadata,
505-
}),
506-
);
499+
this.setRequestHandler(
500+
ListResourcesRequestSchema,
501+
async (request, extra) => {
502+
const resources = Object.entries(this._registeredResources).map(
503+
([uri, resource]) => ({
504+
uri,
505+
name: resource.name,
506+
...resource.metadata,
507+
}),
508+
);
507509

508-
const templateResources: Resource[] = [];
509-
for (const template of Object.values(this._registeredResourceTemplates)) {
510-
if (!template.resourceTemplate.listCallback) {
511-
continue;
512-
}
510+
const templateResources: Resource[] = [];
511+
for (const template of Object.values(
512+
this._registeredResourceTemplates,
513+
)) {
514+
if (!template.resourceTemplate.listCallback) {
515+
continue;
516+
}
513517

514-
const result = await template.resourceTemplate.listCallback();
515-
for (const resource of result.resources) {
516-
templateResources.push({
517-
...resource,
518-
...template.metadata,
519-
});
518+
const result = await template.resourceTemplate.listCallback(extra);
519+
for (const resource of result.resources) {
520+
templateResources.push({
521+
...resource,
522+
...template.metadata,
523+
});
524+
}
520525
}
521-
}
522526

523-
return { resources: [...resources, ...templateResources] };
524-
});
527+
return { resources: [...resources, ...templateResources] };
528+
},
529+
);
525530

526531
this.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
527532
const resourceTemplates = Object.entries(
@@ -535,27 +540,35 @@ export class Server<
535540
return { resourceTemplates };
536541
});
537542

538-
this.setRequestHandler(ReadResourceRequestSchema, async (request) => {
539-
const uri = new URL(request.params.uri);
540-
541-
// First check for exact resource match
542-
const resource = this._registeredResources[uri.toString()];
543-
if (resource) {
544-
return resource.readCallback(uri);
545-
}
543+
this.setRequestHandler(
544+
ReadResourceRequestSchema,
545+
async (request, extra) => {
546+
const uri = new URL(request.params.uri);
547+
548+
// First check for exact resource match
549+
const resource = this._registeredResources[uri.toString()];
550+
if (resource) {
551+
return resource.readCallback(uri, extra);
552+
}
546553

547-
// Then check templates
548-
for (const template of Object.values(this._registeredResourceTemplates)) {
549-
const variables = template.resourceTemplate.uriTemplate.match(
550-
uri.toString(),
551-
);
552-
if (variables) {
553-
return template.readCallback(uri, variables);
554+
// Then check templates
555+
for (const template of Object.values(
556+
this._registeredResourceTemplates,
557+
)) {
558+
const variables = template.resourceTemplate.uriTemplate.match(
559+
uri.toString(),
560+
);
561+
if (variables) {
562+
return template.readCallback(uri, variables, extra);
563+
}
554564
}
555-
}
556565

557-
throw new McpError(ErrorCode.InvalidParams, `Resource ${uri} not found`);
558-
});
566+
throw new McpError(
567+
ErrorCode.InvalidParams,
568+
`Resource ${uri} not found`,
569+
);
570+
},
571+
);
559572
}
560573

561574
/**
@@ -735,15 +748,16 @@ export type ResourceMetadata = Omit<Resource, "uri" | "name">;
735748
/**
736749
* Callback to list all resources matching a given template.
737750
*/
738-
export type ListResourcesCallback = () =>
739-
| ListResourcesResult
740-
| Promise<ListResourcesResult>;
751+
export type ListResourcesCallback = (
752+
extra: RequestHandlerExtra,
753+
) => ListResourcesResult | Promise<ListResourcesResult>;
741754

742755
/**
743756
* Callback to read a resource at a given URI.
744757
*/
745758
export type ReadResourceCallback = (
746759
uri: URL,
760+
extra: RequestHandlerExtra,
747761
) => ReadResourceResult | Promise<ReadResourceResult>;
748762

749763
type RegisteredResource = {
@@ -758,6 +772,7 @@ type RegisteredResource = {
758772
export type ReadResourceTemplateCallback = (
759773
uri: URL,
760774
variables: Variables,
775+
extra: RequestHandlerExtra,
761776
) => ReadResourceResult | Promise<ReadResourceResult>;
762777

763778
type RegisteredResourceTemplate = {

0 commit comments

Comments
 (0)