Skip to content

Commit bb5e585

Browse files
committed
Review
1 parent 34d50d8 commit bb5e585

File tree

8 files changed

+65
-27
lines changed

8 files changed

+65
-27
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ A Model Context Protocol server for interacting with MongoDB Databases and Mongo
1515
- [🛠️ Supported Tools](#supported-tools)
1616
- [MongoDB Atlas Tools](#mongodb-atlas-tools)
1717
- [MongoDB Database Tools](#mongodb-database-tools)
18+
- [MongoDB Assistant Tools](#mongodb-assistant-tools)
1819
- [📄 Supported Resources](#supported-resources)
1920
- [⚙️ Configuration](#configuration)
2021
- [Configuration Options](#configuration-options)
@@ -308,6 +309,11 @@ NOTE: atlas tools are only available when you set credentials on [configuration]
308309
- `db-stats` - Return statistics about a MongoDB database
309310
- `export` - Export query or aggregation results to EJSON format. Creates a uniquely named export accessible via the `exported-data` resource.
310311

312+
#### MongoDB Assistant Tools
313+
314+
- `list-knowledge-sources` - List available data sources in the MongoDB Assistant knowledge base
315+
- `search-knowledge` - Search for information in the MongoDB Assistant knowledge base
316+
311317
## 📄 Supported Resources
312318

313319
- `config` - Server configuration, supplied by the user either as environment variables or as startup arguments with sensitive parameters redacted. The resource can be accessed under URI `config://config`.

src/common/logger.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ export const LogId = {
6262
exportLockError: mongoLogId(1_007_008),
6363

6464
oidcFlow: mongoLogId(1_008_001),
65+
66+
assistantListKnowledgeSourcesError: mongoLogId(1_009_001),
67+
assistantSearchKnowledgeError: mongoLogId(1_009_002),
6568
} as const;
6669

6770
interface LogPayload {

src/tools/assistant/assistantTool.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@ export abstract class AssistantToolBase extends ToolBase {
3131
return super.register(server);
3232
}
3333

34-
protected resolveTelemetryMetadata(
35-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
36-
args: ToolArgs<typeof this.argsShape>
37-
): TelemetryToolMetadata {
34+
protected resolveTelemetryMetadata(_args: ToolArgs<typeof this.argsShape>): TelemetryToolMetadata {
35+
// Assistant tool calls are not associated with a specific project or organization
36+
// Therefore, we don't have any values to add to the telemetry metadata
3837
return {};
3938
}
4039

src/tools/assistant/list_knowledge_sources.ts renamed to src/tools/assistant/listKnowledgeSources.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod";
22
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
33
import { OperationType } from "../tool.js";
44
import { AssistantToolBase } from "./assistantTool.js";
5+
import { LogId } from "../../common/logger.js";
56

67
export const dataSourceMetadataSchema = z.object({
78
id: z.string().describe("The name of the data source"),
@@ -21,7 +22,7 @@ export const listDataSourcesResponseSchema = z.object({
2122
});
2223

2324
export class ListKnowledgeSourcesTool extends AssistantToolBase {
24-
public name = "list_knowledge_sources";
25+
public name = "list-knowledge-sources";
2526
protected description = "List available data sources in the MongoDB Assistant knowledge base";
2627
protected argsShape = {};
2728
public operationType: OperationType = "read";
@@ -33,7 +34,21 @@ export class ListKnowledgeSourcesTool extends AssistantToolBase {
3334
headers: this.requiredHeaders,
3435
});
3536
if (!response.ok) {
36-
throw new Error(`Failed to list knowledge sources: ${response.statusText}`);
37+
const message = `Failed to list knowledge sources: ${response.statusText}`;
38+
this.session.logger.debug({
39+
id: LogId.assistantListKnowledgeSourcesError,
40+
context: "assistant-list-knowledge-sources",
41+
message,
42+
});
43+
return {
44+
content: [
45+
{
46+
type: "text",
47+
text: message,
48+
},
49+
],
50+
isError: true,
51+
};
3752
}
3853
const { dataSources } = listDataSourcesResponseSchema.parse(await response.json());
3954

src/tools/assistant/search_knowledge.ts renamed to src/tools/assistant/searchKnowledge.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod";
22
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
33
import { ToolArgs, OperationType } from "../tool.js";
44
import { AssistantToolBase } from "./assistantTool.js";
5+
import { LogId } from "../../common/logger.js";
56

67
export const SearchKnowledgeToolArgs = {
78
query: z.string().describe("A natural language query to search for in the knowledge base"),
@@ -37,7 +38,7 @@ export const searchResponseSchema = z.object({
3738
});
3839

3940
export class SearchKnowledgeTool extends AssistantToolBase {
40-
public name = "search_knowledge";
41+
public name = "search-knowledge";
4142
protected description = "Search for information in the MongoDB Assistant knowledge base";
4243
protected argsShape = {
4344
...SearchKnowledgeToolArgs,
@@ -52,7 +53,21 @@ export class SearchKnowledgeTool extends AssistantToolBase {
5253
body: JSON.stringify(args),
5354
});
5455
if (!response.ok) {
55-
throw new Error(`Failed to search knowledge base: ${response.statusText}`);
56+
const message = `Failed to search knowledge base: ${response.statusText}`;
57+
this.session.logger.debug({
58+
id: LogId.assistantSearchKnowledgeError,
59+
context: "assistant-search-knowledge",
60+
message,
61+
});
62+
return {
63+
content: [
64+
{
65+
type: "text",
66+
text: message,
67+
},
68+
],
69+
isError: true,
70+
};
5671
}
5772
const { results } = searchResponseSchema.parse(await response.json());
5873
return {

src/tools/assistant/tools.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ListKnowledgeSourcesTool } from "./list_knowledge_sources.js";
2-
import { SearchKnowledgeTool } from "./search_knowledge.js";
1+
import { ListKnowledgeSourcesTool } from "./listKnowledgeSources.js";
2+
import { SearchKnowledgeTool } from "./searchKnowledge.js";
33

44
export const AssistantTools = [ListKnowledgeSourcesTool, SearchKnowledgeTool];

tests/integration/tools/assistant/listKnowledgeSources.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
33
import { expectDefined, validateToolMetadata, getResponseElements } from "../../helpers.js";
44
import { describeWithAssistant, makeMockAssistantAPI } from "./assistantHelpers.js";
55

6-
describeWithAssistant("list_knowledge_sources", (integration) => {
6+
describeWithAssistant("list-knowledge-sources", (integration) => {
77
const { mockListSources, mockAPIError, mockNetworkError } = makeMockAssistantAPI();
88

99
validateToolMetadata(
1010
integration,
11-
"list_knowledge_sources",
11+
"list-knowledge-sources",
1212
"List available data sources in the MongoDB Assistant knowledge base",
1313
[]
1414
);
@@ -38,7 +38,7 @@ describeWithAssistant("list_knowledge_sources", (integration) => {
3838

3939
const response = (await integration
4040
.mcpClient()
41-
.callTool({ name: "list_knowledge_sources", arguments: {} })) as CallToolResult;
41+
.callTool({ name: "list-knowledge-sources", arguments: {} })) as CallToolResult;
4242

4343
expect(response.isError).toBeFalsy();
4444
expect(response.content).toBeInstanceOf(Array);
@@ -72,7 +72,7 @@ describeWithAssistant("list_knowledge_sources", (integration) => {
7272

7373
const response = (await integration
7474
.mcpClient()
75-
.callTool({ name: "list_knowledge_sources", arguments: {} })) as CallToolResult;
75+
.callTool({ name: "list-knowledge-sources", arguments: {} })) as CallToolResult;
7676

7777
expect(response.isError).toBeFalsy();
7878
expect(response.content).toBeInstanceOf(Array);
@@ -86,7 +86,7 @@ describeWithAssistant("list_knowledge_sources", (integration) => {
8686

8787
const response = (await integration
8888
.mcpClient()
89-
.callTool({ name: "list_knowledge_sources", arguments: {} })) as CallToolResult;
89+
.callTool({ name: "list-knowledge-sources", arguments: {} })) as CallToolResult;
9090

9191
expect(response.isError).toBe(true);
9292
expectDefined(response.content);
@@ -99,7 +99,7 @@ describeWithAssistant("list_knowledge_sources", (integration) => {
9999

100100
const response = (await integration
101101
.mcpClient()
102-
.callTool({ name: "list_knowledge_sources", arguments: {} })) as CallToolResult;
102+
.callTool({ name: "list-knowledge-sources", arguments: {} })) as CallToolResult;
103103

104104
expect(response.isError).toBe(true);
105105
expectDefined(response.content);
@@ -113,7 +113,7 @@ describeWithAssistant("list_knowledge_sources", (integration) => {
113113

114114
const response = (await integration
115115
.mcpClient()
116-
.callTool({ name: "list_knowledge_sources", arguments: {} })) as CallToolResult;
116+
.callTool({ name: "list-knowledge-sources", arguments: {} })) as CallToolResult;
117117

118118
expect(response.isError).toBe(true);
119119
expectDefined(response.content);

tests/integration/tools/assistant/searchKnowledge.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import {
88
} from "../../helpers.js";
99
import { describeWithAssistant, makeMockAssistantAPI } from "./assistantHelpers.js";
1010

11-
describeWithAssistant("search_knowledge", (integration) => {
11+
describeWithAssistant("search-knowledge", (integration) => {
1212
const { mockSearchResults, mockAPIError, mockNetworkError } = makeMockAssistantAPI();
1313

1414
validateToolMetadata(
1515
integration,
16-
"search_knowledge",
16+
"search-knowledge",
1717
"Search for information in the MongoDB Assistant knowledge base",
1818
[
1919
{
@@ -38,7 +38,7 @@ describeWithAssistant("search_knowledge", (integration) => {
3838
]
3939
);
4040

41-
validateThrowsForInvalidArguments(integration, "search_knowledge", [
41+
validateThrowsForInvalidArguments(integration, "search-knowledge", [
4242
{}, // missing required query
4343
{ query: 123 }, // invalid query type
4444
{ query: "test", limit: -1 }, // invalid limit
@@ -74,7 +74,7 @@ describeWithAssistant("search_knowledge", (integration) => {
7474
mockSearchResults(mockResults);
7575

7676
const response = (await integration.mcpClient().callTool({
77-
name: "search_knowledge",
77+
name: "search-knowledge",
7878
arguments: { query: "aggregation pipeline" },
7979
})) as CallToolResult;
8080

@@ -117,7 +117,7 @@ describeWithAssistant("search_knowledge", (integration) => {
117117
mockSearchResults(mockResults);
118118

119119
const response = (await integration.mcpClient().callTool({
120-
name: "search_knowledge",
120+
name: "search-knowledge",
121121
arguments: {
122122
query: "node.js driver",
123123
limit: 1,
@@ -144,7 +144,7 @@ describeWithAssistant("search_knowledge", (integration) => {
144144

145145
const response = (await integration
146146
.mcpClient()
147-
.callTool({ name: "search_knowledge", arguments: { query: "nonexistent topic" } })) as CallToolResult;
147+
.callTool({ name: "search-knowledge", arguments: { query: "nonexistent topic" } })) as CallToolResult;
148148

149149
expect(response.isError).toBeFalsy();
150150
expect(response.content).toBeInstanceOf(Array);
@@ -165,7 +165,7 @@ describeWithAssistant("search_knowledge", (integration) => {
165165

166166
const response = (await integration
167167
.mcpClient()
168-
.callTool({ name: "search_knowledge", arguments: { query: "test query" } })) as CallToolResult;
168+
.callTool({ name: "search-knowledge", arguments: { query: "test query" } })) as CallToolResult;
169169

170170
expect(response.isError).toBeFalsy();
171171
expect(response.content).toHaveLength(5);
@@ -178,7 +178,7 @@ describeWithAssistant("search_knowledge", (integration) => {
178178

179179
const response = (await integration
180180
.mcpClient()
181-
.callTool({ name: "search_knowledge", arguments: { query: "test query" } })) as CallToolResult;
181+
.callTool({ name: "search-knowledge", arguments: { query: "test query" } })) as CallToolResult;
182182

183183
expect(response.isError).toBe(true);
184184
expectDefined(response.content);
@@ -191,7 +191,7 @@ describeWithAssistant("search_knowledge", (integration) => {
191191

192192
const response = (await integration
193193
.mcpClient()
194-
.callTool({ name: "search_knowledge", arguments: { query: "test query" } })) as CallToolResult;
194+
.callTool({ name: "search-knowledge", arguments: { query: "test query" } })) as CallToolResult;
195195

196196
expect(response.isError).toBe(true);
197197
expectDefined(response.content);
@@ -205,7 +205,7 @@ describeWithAssistant("search_knowledge", (integration) => {
205205

206206
const response = (await integration
207207
.mcpClient()
208-
.callTool({ name: "search_knowledge", arguments: { query: "test query" } })) as CallToolResult;
208+
.callTool({ name: "search-knowledge", arguments: { query: "test query" } })) as CallToolResult;
209209

210210
expect(response.isError).toBe(true);
211211
expectDefined(response.content);

0 commit comments

Comments
 (0)