-
Notifications
You must be signed in to change notification settings - Fork 128
feat(search): Add a new tool to list search and vector search indexes MCP-235 #610
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
📊 Accuracy Test Results📈 Summary
📊 Baseline Comparison
📎 Download Full HTML Report - Look for the Report generated on: 10/6/2025, 1:52:38 PM |
Pull Request Test Coverage Report for Build 18284013540Details
💛 - Coveralls |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR adds a new MongoDB MCP tool called "list-search-indexes" that allows users to list search and vector search indexes for a specific collection. The tool detects Atlas Search support by catching exceptions and provides appropriate error messages for unsupported clusters.
Key changes:
- New search indexes listing tool with comprehensive test coverage
- Enhanced test infrastructure to support Atlas Local containers via Docker
- Refactored shared utilities and improved test organization
Reviewed Changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 6 comments.
Show a summary per file
File | Description |
---|---|
src/tools/mongodb/search/listSearchIndexes.ts |
Core implementation of the new list-search-indexes tool |
tests/integration/tools/mongodb/search/listSearchIndexes.test.ts |
Integration tests for the new tool with Atlas Local support |
tests/integration/tools/mongodb/mongodbHelpers.ts |
Enhanced test helpers to support Docker containers and search clusters |
tests/accuracy/listSearchIndexes.test.ts |
Accuracy tests for the new tool |
src/tools/mongodb/tools.ts |
Registers the new tool in the MongoDB tools array |
tests/integration/transports/stdio.test.ts |
Updates tool count expectation |
tests/integration/helpers.ts |
Adds shared sleep utility function |
tests/integration/tools/atlas/clusters.test.ts |
Uses shared sleep utility |
package.json |
Adds testcontainers dependencies |
.github/workflows/code-health.yml |
Adds Docker setup for CI |
.github/workflows/code-health-fork.yml |
Adds Docker setup for fork CI |
tests/integration/tools/mongodb/search/listSearchIndexes.test.ts
Outdated
Show resolved
Hide resolved
tests/integration/tools/mongodb/search/listSearchIndexes.test.ts
Outdated
Show resolved
Hide resolved
tests/integration/tools/mongodb/search/listSearchIndexes.test.ts
Outdated
Show resolved
Hide resolved
tests/integration/tools/mongodb/search/listSearchIndexes.test.ts
Outdated
Show resolved
Hide resolved
It detects if the cluster supports search indexes the same way we do in all other tooling: by catching the exception. In some old clusters it might still return an empty list for unsupported custers, but we can't really know for sure. As we depend on mongot, we need to use the Atlas local image, which is not supported by mongodb-runner. Instead, we use testcontainers, that allows to run any docker image, which is enough for our use case. For now only run docker tests in Ubuntu * macos-latest does not support nested virtualisation yet * we don't have windows containers for atlas images
if: matrix.os == 'ubuntu-latest' | ||
- uses: actions/checkout@v5 | ||
- uses: docker/setup-docker-action@v4 | ||
if: matrix.os == 'ubuntu-latest' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm... why use this only on ubuntu runners?
latestDefinition: Document; | ||
}; | ||
|
||
export class ListSearchIndexesTool extends MongoDBToolBase { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
q: Why is this a separate tool instead of bundling the response in the collection-indexes
tool?
downloadOptions: MongoClusterOptions["downloadOptions"] | MongoSearchConfiguration | ||
): boolean { | ||
// on GHA, OSX does not support nested virtualisation and we don't release | ||
// windows containers, so for now we can only run these tests in Linux. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe I'm misunderstanding something here, but shouldn't docker on windows be able to run the linux images we publish?
} | ||
|
||
function isTestContainersCluster( | ||
cluster: MongoCluster | StartedTestContainer | undefined |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if we want to create a simple wrapper around MongoCluster
and StartedTestContainer
so that we don't have to do a bunch of checks throughout this file.
arguments: { database: "any", collection: "foo" }, | ||
}); | ||
const content = getResponseContent(response.content); | ||
expect(content).toEqual("There are no search or vector search indexes in any.foo"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this check correct? I'd expect the content to contain the untrusted data wrapper.
success = true; | ||
break; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than set success
to true
and break, you can return.
Proposed changes
It detects if the cluster supports search indexes the same way we do in all other tooling: by catching the exception. In some old clusters it might still return an empty list for unsupported clusters, but we can't really know for sure.
Checklist