Skip to content

Commit 45f99e6

Browse files
committed
Make Variables non-optional with resource template URIs
1 parent 3f9acec commit 45f99e6

File tree

2 files changed

+61
-12
lines changed

2 files changed

+61
-12
lines changed

src/server/index.test.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,50 @@ describe("Server.resource", () => {
11221122
expect(result.resources[1].uri).toBe("test://resource/2");
11231123
});
11241124

1125+
test("should pass template variables to readCallback", async () => {
1126+
const server = new Server({
1127+
name: "test server",
1128+
version: "1.0",
1129+
});
1130+
const client = new Client({
1131+
name: "test client",
1132+
version: "1.0",
1133+
});
1134+
1135+
server.resource(
1136+
"test",
1137+
new UriTemplate("test://resource/{category}/{id}"),
1138+
async (uri, { category, id }) => ({
1139+
contents: [
1140+
{
1141+
uri: uri.href,
1142+
text: `Category: ${category}, ID: ${id}`,
1143+
},
1144+
],
1145+
}),
1146+
);
1147+
1148+
const [clientTransport, serverTransport] =
1149+
InMemoryTransport.createLinkedPair();
1150+
1151+
await Promise.all([
1152+
client.connect(clientTransport),
1153+
server.connect(serverTransport),
1154+
]);
1155+
1156+
const result = await client.request(
1157+
{
1158+
method: "resources/read",
1159+
params: {
1160+
uri: "test://resource/books/123",
1161+
},
1162+
},
1163+
ReadResourceResultSchema,
1164+
);
1165+
1166+
expect(result.contents[0].text).toBe("Category: books, ID: 123");
1167+
});
1168+
11251169
test("should prevent duplicate resource registration", () => {
11261170
const server = new Server({
11271171
name: "test server",

src/server/index.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,30 @@ const EMPTY_OBJECT_JSON_SCHEMA = {
7878

7979
export type ResourceMetadata = Omit<Resource, "uri" | "name">;
8080

81-
export type ReadResourceCallback = (
82-
uri: URL,
83-
variables?: Variables,
84-
) => ReadResourceResult | Promise<ReadResourceResult>;
85-
8681
export type ListResourcesCallback = () =>
8782
| ListResourcesResult
8883
| Promise<ListResourcesResult>;
8984

85+
export type ReadResourceCallback = (
86+
uri: URL,
87+
) => ReadResourceResult | Promise<ReadResourceResult>;
88+
9089
type RegisteredResource = {
9190
name: string;
9291
metadata?: ResourceMetadata;
9392
readCallback: ReadResourceCallback;
9493
};
9594

95+
export type ReadResourceTemplateCallback = (
96+
uri: URL,
97+
variables: Variables,
98+
) => ReadResourceResult | Promise<ReadResourceResult>;
99+
96100
type RegisteredResourceTemplate = {
97101
uriTemplate: UriTemplate;
98102
metadata?: ResourceMetadata;
99103
listCallback?: ListResourcesCallback;
100-
readCallback: ReadResourceCallback;
104+
readCallback: ReadResourceTemplateCallback;
101105
};
102106

103107
/**
@@ -624,7 +628,7 @@ export class Server<
624628
resource(
625629
name: string,
626630
uriTemplate: UriTemplate,
627-
readCallback: ReadResourceCallback,
631+
readCallback: ReadResourceTemplateCallback,
628632
): void;
629633

630634
/**
@@ -634,7 +638,7 @@ export class Server<
634638
name: string,
635639
uriTemplate: UriTemplate,
636640
metadata: ResourceMetadata,
637-
readCallback: ReadResourceCallback,
641+
readCallback: ReadResourceTemplateCallback,
638642
): void;
639643

640644
/**
@@ -644,7 +648,7 @@ export class Server<
644648
name: string,
645649
uriTemplate: UriTemplate,
646650
listCallback: ListResourcesCallback,
647-
readCallback: ReadResourceCallback,
651+
readCallback: ReadResourceTemplateCallback,
648652
): void;
649653

650654
/**
@@ -655,7 +659,7 @@ export class Server<
655659
uriTemplate: UriTemplate,
656660
metadata: ResourceMetadata,
657661
listCallback: ListResourcesCallback,
658-
readCallback: ReadResourceCallback,
662+
readCallback: ReadResourceTemplateCallback,
659663
): void;
660664

661665
resource(
@@ -673,15 +677,16 @@ export class Server<
673677
listCallback = rest.shift() as ListResourcesCallback;
674678
}
675679

676-
const readCallback = rest[0] as ReadResourceCallback;
677680
if (typeof uriOrTemplate === "string") {
681+
const readCallback = rest[0] as ReadResourceCallback;
678682
this.registerResource({
679683
name,
680684
uri: uriOrTemplate,
681685
metadata,
682686
readCallback,
683687
});
684688
} else {
689+
const readCallback = rest[0] as ReadResourceTemplateCallback;
685690
this.registerResourceTemplate({
686691
name,
687692
uriTemplate: uriOrTemplate,
@@ -727,7 +732,7 @@ export class Server<
727732
uriTemplate: UriTemplate;
728733
metadata?: ResourceMetadata;
729734
listCallback?: ListResourcesCallback;
730-
readCallback: ReadResourceCallback;
735+
readCallback: ReadResourceTemplateCallback;
731736
}): void {
732737
if (this._registeredResourceTemplates[name]) {
733738
throw new Error(`Resource template ${name} is already registered`);

0 commit comments

Comments
 (0)