Skip to content

chore: add arg-parser and put the config under test MCP-86 #429

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

Open
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

kmruiz
Copy link
Collaborator

@kmruiz kmruiz commented Aug 7, 2025

Proposed changes

Use mongosh argument parser to generate the connection string that is going to be used to connect to MongoDB, aligning with how mongosh does it and making sure we support additional authentication mechanisms. It removes a bunch of flags and types not necessary now with the consolidation.

There will be integration tests for each of the supported connection types when playing each of their tasks. Specific support is out of the scope of this PR.

Checklist

kmruiz added 3 commits August 8, 2025 11:37
This commit is biggish because it adds a big chunk of tests
that weren't there before. While it would be arguably that
testing every flag might be too much, because I'm changing
how arguments are parsed, I want to have this as a safeline.
For help we are refering to the README.md, if we want something more
fancy we porobably want to have better documentation generation so we
don't maintain two files (here and the README.md)
The driver options can not be sent by the agent, so we are going to
use the ones specified in the CLI arguments / ENV Vars. This is
relevant because new connections should use any inherited
configuration like TLS settings or FIPS by default.
@kmruiz kmruiz marked this pull request as ready for review August 8, 2025 10:16
@Copilot Copilot AI review requested due to automatic review settings August 8, 2025 10:16
@kmruiz kmruiz requested a review from a team as a code owner August 8, 2025 10:16
Copilot

This comment was marked as outdated.

kmruiz and others added 2 commits August 8, 2025 12:18
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@kmruiz kmruiz requested a review from Copilot August 8, 2025 11:00
Copy link
Contributor

@Copilot Copilot AI left a 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 refactors the configuration management system to use the @mongosh/arg-parser library for generating MongoDB connection strings. This change aligns with how mongosh handles connection arguments and ensures support for additional authentication mechanisms. The refactoring removes several deprecated flags and types that are no longer necessary with the consolidated approach.

  • Uses mongosh argument parser to standardize connection string generation and authentication support
  • Consolidates configuration by removing the separate ConnectOptions interface and moving connection options to driver-level configuration
  • Removes hardcoded connection options from test files and connection calls throughout the codebase

Reviewed Changes

Copilot reviewed 13 out of 14 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/common/config.ts Major refactor to use mongosh arg-parser with new configuration parsing and driver options setup
tests/unit/common/config.test.ts Comprehensive test suite for the new configuration parsing functionality
src/index.ts Added FIPS mode support, help/version modes, and system CA loading
tests/unit/common/session.test.ts Removed deprecated connectOptions usage in tests
tests/integration/tools/mongodb/connect/connect.test.ts Removed deprecated connectOptions usage in integration tests
tests/integration/common/connectionManager.test.ts Removed deprecated connectOptions usage and import
src/tools/mongodb/mongodbTool.ts Simplified connection call by removing connectOptions spread
src/tools/atlas/connect/connectCluster.ts Simplified connection call by removing connectOptions spread
src/server.ts Simplified connection call by removing connectOptions spread
src/resources/common/config.ts Updated to use new driverOptions export instead of connectOptions
src/lib.ts Removed ConnectOptions from exports
src/common/connectionManager.ts Refactored to use new driverOptions configuration
package.json Added @mongosh/arg-parser dependency

Comment on lines +7 to +8
// From: https://github.com/mongodb-js/mongosh/blob/main/packages/cli-repl/src/arg-parser.ts
const OPTIONS = {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be an option to import it from the args-parser package instead?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so:

  1. args-parser does not expose it, we would need to update it, which is fine but
  2. we don't support all arguments (eval for example) so we would still need to filter or do some post processing.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea but I still think its just a pretty long list to copy here instead of something like this?

Omit<Options, "eval" | "or" | "others">

that way you at-least have one source of truth.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While they are similar, we do support more options (for the legacy options and Atlas credentials) and I feel being explicit on what we do support additionally and what we don't support is better. If we depend on mongosh and we add more mongosh specific flags we would inherit them without validation.

Comment on lines +131 to +132
console.log("For usage information refer to the README.md:");
console.log("https://github.com/mongodb-js/mongodb-mcp-server?tab=readme-ov-file#quick-start");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these should be console.error or console.warn. We shouldn't be logging to stdio as that is reserved for transport.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's reserved once the transport is started, but this is done before the transport is started. This is for developers using --help to understand the arguments in their console, it's not expected to be used in a mcp.json file or similar.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, but then you might wanna verify the behaviour of transport on start when you already have pushed some non-json rpc messages.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These functions early exit, so there wouldn't be a situation where we issue a warning and then start the transport. That's why the signature of the function is void | never.

@coveralls
Copy link
Collaborator

coveralls commented Aug 8, 2025

Pull Request Test Coverage Report for Build 16830919759

Details

  • 195 of 254 (76.77%) changed or added relevant lines in 6 files are covered.
  • 7 unchanged lines in 2 files lost coverage.
  • Overall coverage increased (+0.2%) to 81.516%

Changes Missing Coverage Covered Lines Changed/Added Lines %
src/resources/common/config.ts 1 2 50.0%
src/common/config.ts 190 198 95.96%
src/index.ts 0 50 0.0%
Files with Coverage Reduction New Missed Lines %
src/index.ts 1 0.83%
src/common/session.ts 6 84.68%
Totals Coverage Status
Change from base Build 16826971263: 0.2%
Covered Lines: 3695
Relevant Lines: 4507

💛 - Coveralls

@kmruiz kmruiz requested a review from himanshusinghs August 11, 2025 07:26
@@ -1,11 +1,37 @@
#!/usr/bin/env node

let fipsError: Error | undefined;
Copy link
Collaborator

@gagik gagik Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not just throw the error right away? would be good to avoid global variables if we can

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because in line 108 we do more checks that need to be done after this.

  1. We first enable FIPS before anything.
  2. Then after we load the flags, we check different configurations and then give a specific error message (for example, shared openssl vs bundled)
  3. Then we show FIPS error details based on the actual configuration.

@@ -78,3 +104,39 @@ main().catch((error: unknown) => {
});
process.exit(1);
});

function assertFIPSMode(): void | never {
Copy link
Collaborator

@gagik gagik Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
function assertFIPSMode(): void | never {
function assertFIPSMode(): void {

nit: same below

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? void | never makes explicit that this function either doesn't return anything or exits the process.

@@ -78,3 +104,39 @@ main().catch((error: unknown) => {
});
process.exit(1);
});

function assertFIPSMode(): void | never {
Copy link
Collaborator

@gagik gagik Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be good to keep the index.ts file as small as possible and move these to their own file(s)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I personally prefer to have all initialisation functions that can exit the process in the main file so it's clear that outside this file no one should do process.exit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants