Skip to content

Commit 11ca6b6

Browse files
committed
fix: change some resource templates into resources
team_members, mob_session_coauthors, mob_session_coauthor_trailers and git_mob_version are static resources that do not depend on any input. Therefore these are changed from resource templates into resources. This makes them work in the MCP Inspector Kept git_mob_help as a resource template as its dynamic - the content changes when command is supplied. This is yet to be tested to be working in MCP Inspector
1 parent 447453a commit 11ca6b6

24 files changed

+151
-117
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ Built using [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/
3333
- `setup_git_mob_globally`: Sets up git-mob globally for the user.
3434
- `setup_git_mob_locally`: Sets up git-mob locally for the current repository.
3535

36-
Because dynamic resources are not yet supported in GitHub Copilot, the resources are also available as tools:
37-
- `get_git_mob_help`: Displays general help and usage information for the Git Mob CLI.
36+
Because resources may not be fully supported in GitHub Copilot Agent mode yet, the some of them are also available as tools:
3837
- `get_git_mob_version`: The installed version of the Git Mob CLI.
3938
- `get_team_members`: List of all the team members that have been added to Git Mob.
4039
- `get_mob_session_coauthors`: List of all coauthors currently included in the active mob or pairing session.

src/gitMobServerFactory.test.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { describe, it, expect, jest } from "@jest/globals";
22
import * as helpers from "./helpers/index.js";
33
import * as resources from "./resources/index.js";
4+
import * as resourceTemplates from "./resourceTemplates/index.js";
45
import * as tools from "./tools/index.js";
56
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
67
import { createGitMobServer } from "./gitMobServerFactory.js";
78

89
jest.mock("./helpers/index.js", () => ({
910
registerGitMobTool: jest.fn(),
1011
registerGitMobResource: jest.fn(),
12+
registerGitMobResourceTemplate: jest.fn(),
1113
registerGtMobResourceAsTool: jest.fn(),
1214
}));
1315
jest.mock("@modelcontextprotocol/sdk/server/mcp.js", () => {
@@ -35,6 +37,17 @@ describe("gitMobServerFactory: createGitMobServer", () => {
3537
);
3638
});
3739

40+
it("should register all resource templates", async () => {
41+
const { registerGitMobResourceTemplate } = helpers;
42+
43+
const server = createGitMobServer();
44+
45+
expect(registerGitMobResourceTemplate).toHaveBeenCalledWith(
46+
server,
47+
resourceTemplates.gitMobHelp,
48+
);
49+
});
50+
3851
it("should register all resources", async () => {
3952
const { registerGitMobResource } = helpers;
4053

@@ -44,10 +57,6 @@ describe("gitMobServerFactory: createGitMobServer", () => {
4457
server,
4558
resources.gitMobVersion,
4659
);
47-
expect(registerGitMobResource).toHaveBeenCalledWith(
48-
server,
49-
resources.gitMobHelp,
50-
);
5160
expect(registerGitMobResource).toHaveBeenCalledWith(
5261
server,
5362
resources.teamMembers,
@@ -71,10 +80,6 @@ describe("gitMobServerFactory: createGitMobServer", () => {
7180
server,
7281
resources.gitMobVersion,
7382
);
74-
expect(registerGtMobResourceAsTool).toHaveBeenCalledWith(
75-
server,
76-
resources.gitMobHelp,
77-
);
7883
expect(registerGtMobResourceAsTool).toHaveBeenCalledWith(
7984
server,
8085
resources.teamMembers,

src/gitMobServerFactory.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22

33
import * as tools from "./tools/index.js";
44
import * as resources from "./resources/index.js";
5+
import * as resourceTemplates from "./resourceTemplates/index.js";
56
import {
67
registerGitMobTool,
78
registerGitMobResource,
89
registerGtMobResourceAsTool,
10+
registerGitMobResourceTemplate,
911
} from "./helpers/index.js";
1012

1113
export const createGitMobServer = () => {
@@ -22,16 +24,16 @@ export const createGitMobServer = () => {
2224
},
2325
);
2426

27+
registerGitMobResourceTemplate(server, resourceTemplates.gitMobHelp);
28+
2529
registerGitMobResource(server, resources.gitMobVersion);
26-
registerGitMobResource(server, resources.gitMobHelp);
2730
registerGitMobResource(server, resources.teamMembers);
2831
registerGitMobResource(server, resources.mobSessionCoauthors);
2932
registerGitMobResource(server, resources.mobSessionCoauthorTrailers);
3033

3134
// Currently, Github Copilot does not support dynamic resources in MCP Server,
3235
// so we register them as tools as well
3336
registerGtMobResourceAsTool(server, resources.gitMobVersion);
34-
registerGtMobResourceAsTool(server, resources.gitMobHelp);
3537
registerGtMobResourceAsTool(server, resources.teamMembers);
3638
registerGtMobResourceAsTool(server, resources.mobSessionCoauthors);
3739
registerGtMobResourceAsTool(server, resources.mobSessionCoauthorTrailers);

src/helpers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from "./registerGitMobTool.js";
22
export * from "./registerGitMobResource.js";
3+
export * from "./registerGitMobResourceTemplate.js";
34
export * from "./registerGitMobResourceAsTool.js";
45
export * from "./runCliCommand.js";

src/helpers/registerGitMobResource.test.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@ import { registerGitMobResource } from "./registerGitMobResource.js";
33
import type { GitMobResource } from "../types/GitMobResource.js";
44
import type {
55
McpServer,
6-
ReadResourceTemplateCallback,
7-
} from "@modelcontextprotocol/sdk/server/mcp.js";
8-
import {
9-
ResourceTemplate,
10-
type ResourceMetadata,
6+
ReadResourceCallback,
117
} from "@modelcontextprotocol/sdk/server/mcp.js";
8+
import { type ResourceMetadata } from "@modelcontextprotocol/sdk/server/mcp.js";
129

1310
describe("[helpers] registerGitMobResource", () => {
1411
it("should register given git mob resource with the given server", () => {
@@ -17,14 +14,12 @@ describe("[helpers] registerGitMobResource", () => {
1714
} as Partial<McpServer> as McpServer;
1815

1916
const name = "test_resource";
20-
const template = new ResourceTemplate("gitmob://test-resource", {
21-
list: undefined,
22-
});
17+
const uri = "gitmob://test-resource";
2318
const metadata: ResourceMetadata = {
2419
description: "This is a test resource for testing purposes.",
2520
mimeType: "text/plain",
2621
};
27-
const readCallback: ReadResourceTemplateCallback = async (uri) => {
22+
const readCallback: ReadResourceCallback = async (uri) => {
2823
return {
2924
contents: [
3025
{
@@ -36,7 +31,7 @@ describe("[helpers] registerGitMobResource", () => {
3631
};
3732
const testResource: GitMobResource = {
3833
name,
39-
template,
34+
uri,
4035
metadata,
4136
readCallback,
4237
};
@@ -45,7 +40,7 @@ describe("[helpers] registerGitMobResource", () => {
4540

4641
expect(mockServer.resource).toHaveBeenCalledWith(
4742
testResource.name,
48-
testResource.template,
43+
testResource.uri,
4944
testResource.metadata,
5045
testResource.readCallback,
5146
);

src/helpers/registerGitMobResource.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ export const registerGitMobResource = (
55
server: McpServer,
66
resource: GitMobResource,
77
) => {
8-
const { name, template, metadata, readCallback } = resource;
9-
server.resource(name, template, metadata, readCallback);
8+
const { name, uri, metadata, readCallback } = resource;
9+
server.resource(name, uri, metadata, readCallback);
1010
};

src/helpers/registerGitMobResourceAsTool.test.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { describe, it, expect, jest } from "@jest/globals";
22
import { registerGtMobResourceAsTool } from "./registerGitMobResourceAsTool.js";
33
import type { GitMobResource } from "../types/GitMobResource.js";
44
import {
5-
ResourceTemplate,
65
type ResourceMetadata,
76
type ReadResourceTemplateCallback,
87
type McpServer,
@@ -21,9 +20,7 @@ describe("[helpers] registerGtMobResourceAsTool", () => {
2120
} as Partial<McpServer> as McpServer;
2221

2322
const name = "test_resource";
24-
const template = new ResourceTemplate("gitmob://test-resource", {
25-
list: undefined,
26-
});
23+
const uri = "gitmob://test-resource";
2724
const metadata: ResourceMetadata = {
2825
description: "This is a test resource for testing purposes.",
2926
mimeType: "text/plain",
@@ -38,7 +35,7 @@ describe("[helpers] registerGtMobResourceAsTool", () => {
3835
};
3936
const testResource: GitMobResource = {
4037
name,
41-
template,
38+
uri,
4239
metadata,
4340
readCallback,
4441
};

src/helpers/registerGitMobResourceAsTool.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const registerGtMobResourceAsTool = (
1717
server: McpServer,
1818
resource: GitMobResource,
1919
) => {
20-
const { name, template, metadata, readCallback } = resource;
20+
const { name, uri, metadata, readCallback } = resource;
2121

2222
const toolName = `get_${name}`;
2323

@@ -30,14 +30,10 @@ export const registerGtMobResourceAsTool = (
3030
};
3131

3232
const toolCallback: ToolCallback<Record<string, never>> = async (
33-
args: Variables,
33+
_args: Variables,
3434
extra: RequestHandlerExtra<ServerRequest, ServerNotification>,
3535
) => {
36-
const resourceResult = await readCallback(
37-
new URL(template.uriTemplate),
38-
args,
39-
extra,
40-
);
36+
const resourceResult = await readCallback(new URL(uri), extra);
4137
const toolResult: CallToolResult = {
4238
content: resourceResult.contents
4339
.filter((content) => typeof content.text === "string")
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { describe, it, expect, jest } from "@jest/globals";
2+
import { registerGitMobResourceTemplate } from "./registerGitMobResourceTemplate.js";
3+
import type { GitMobResourceTemplate } from "../types/GitMobResourceTemplate.js";
4+
import type {
5+
McpServer,
6+
ReadResourceTemplateCallback,
7+
} from "@modelcontextprotocol/sdk/server/mcp.js";
8+
import {
9+
ResourceTemplate,
10+
type ResourceMetadata,
11+
} from "@modelcontextprotocol/sdk/server/mcp.js";
12+
13+
describe("[helpers] registerGitMobResourceTemplate", () => {
14+
it("should register given git mob resource template with the given server", () => {
15+
const mockServer = {
16+
resource: jest.fn(),
17+
} as Partial<McpServer> as McpServer;
18+
19+
const name = "test_resource";
20+
const template = new ResourceTemplate("gitmob://test-resource", {
21+
list: undefined,
22+
});
23+
const metadata: ResourceMetadata = {
24+
description: "This is a test resource for testing purposes.",
25+
mimeType: "text/plain",
26+
};
27+
const readCallback: ReadResourceTemplateCallback = async (uri) => {
28+
return {
29+
contents: [
30+
{
31+
uri: uri.href,
32+
text: "hello world",
33+
},
34+
],
35+
};
36+
};
37+
const testResourceTemplate: GitMobResourceTemplate = {
38+
name,
39+
template,
40+
metadata,
41+
readCallback,
42+
};
43+
44+
registerGitMobResourceTemplate(mockServer, testResourceTemplate);
45+
46+
expect(mockServer.resource).toHaveBeenCalledWith(
47+
testResourceTemplate.name,
48+
testResourceTemplate.template,
49+
testResourceTemplate.metadata,
50+
testResourceTemplate.readCallback,
51+
);
52+
});
53+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { GitMobResourceTemplate } from "../types/GitMobResourceTemplate";
2+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp";
3+
4+
export const registerGitMobResourceTemplate = (
5+
server: McpServer,
6+
resource: GitMobResourceTemplate,
7+
) => {
8+
const { name, template, metadata, readCallback } = resource;
9+
server.resource(name, template, metadata, readCallback);
10+
};

0 commit comments

Comments
 (0)