From edf3929504e4c3cfdca591e49c8e5abb2e2b75d9 Mon Sep 17 00:00:00 2001 From: adam jones Date: Fri, 29 Aug 2025 12:17:53 +0100 Subject: [PATCH] fix: Named arguments should identify the argument name (#321) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Originally by @dmartinol. This branch is an attempt by @domdomegg to fix the merge conflicts... --- ## Motivation and Context Closes #145 Add comprehensive validation for named arguments in MCP server packages to ensure argument names, values, and defaults follow proper format conventions. This prevents common issues where argument names contain embedded values or descriptions, and where values/defaults incorrectly start with the argument name itself. Key changes: - Add ArgumentValidator with validation rules for named argument format - Enhance PackageValidator to validate runtime and package arguments - Update import process to log warnings for invalid servers instead of failing - Fix 396 servers in seed.json with malformed named arguments - Extended `validate-examples` tool to apply the object validator (it was completely missed before) - Add comprehensive test coverage for all validation scenarios Examples of fixes applied: - "--directory " → "--directory" with value "" - "--with-editable $REPO" → "--with-editable" with value "$REPO" - "recipient@example.com" → "--recipient" (proper argument naming) All servers now pass validation during both API publishing and data import. 🤖 Generated with [Claude Code](https://claude.ai/code) ## How Has This Been Tested? With ad-hoc unit tests. Manual integration tests of built artifact and the seed data. ## Breaking Changes New registrations need to follow the argument name conventions, otherwise the import would fail for the inconsistent servers. ## Types of changes - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [x] I have added appropriate error handling - [ ] I have added or updated documentation as needed --------- Signed-off-by: Daniele Martinoli Co-authored-by: Daniele Martinoli Co-authored-by: Claude --- data/seed.json | 1392 ++++++++++++------------ internal/database/import.go | 33 +- internal/database/import_test.go | 18 +- internal/validators/constants.go | 6 + internal/validators/validators.go | 60 + internal/validators/validators_test.go | 223 ++++ tools/validate-examples/main.go | 115 +- 7 files changed, 1099 insertions(+), 748 deletions(-) diff --git a/data/seed.json b/data/seed.json index 0b3ec63..d59d928 100644 --- a/data/seed.json +++ b/data/seed.json @@ -56,10 +56,10 @@ "description": "Directory to run the project from", "is_required": true, "format": "string", - "value": "--directory \u003cabsolute_path_to_adfin_mcp_folder\u003e", - "default": "--directory \u003cabsolute_path_to_adfin_mcp_folder\u003e", + "value": "\u003cabsolute_path_to_adfin_mcp_folder\u003e", + "default": "\u003cabsolute_path_to_adfin_mcp_folder\u003e", "type": "named", - "name": "--directory \u003cabsolute_path_to_adfin_mcp_folder\u003e", + "name": "--directory", "value_hint": "\u003cabsolute_path_to_adfin_mcp_folder\u003e" }, { @@ -200,30 +200,30 @@ "description": "$REPOSITORY_DIRECTORY", "is_required": true, "format": "string", - "value": "--directory $REPOSITORY_DIRECTORY", - "default": "--directory $REPOSITORY_DIRECTORY", + "value": "$REPOSITORY_DIRECTORY", + "default": "$REPOSITORY_DIRECTORY", "type": "named", - "name": "--directory $REPOSITORY_DIRECTORY", + "name": "--directory", "value_hint": "$REPOSITORY_DIRECTORY" }, { "description": "--with-editable $REPOSITORY_DIRECTORY", "is_required": true, "format": "string", - "value": "--with-editable $REPOSITORY_DIRECTORY", - "default": "--with-editable $REPOSITORY_DIRECTORY", + "value": "$REPOSITORY_DIRECTORY", + "default": "$REPOSITORY_DIRECTORY", "type": "named", - "name": "--with-editable $REPOSITORY_DIRECTORY", + "name": "--with-editable", "value_hint": "$REPOSITORY_DIRECTORY" }, { "description": "--python 3.13", "is_required": true, "format": "string", - "value": "--python 3.13", - "default": "--python 3.13", + "value": "3.13", + "default": "3.13", "type": "named", - "name": "--python 3.13", + "name": "--python", "value_hint": "3.13" }, { @@ -281,10 +281,10 @@ "description": "With flag and value", "is_required": true, "format": "string", - "value": "--with adb-mysql-mcp-server", - "default": "--with adb-mysql-mcp-server", + "value": "adb-mysql-mcp-server", + "default": "adb-mysql-mcp-server", "type": "named", - "name": "--with adb-mysql-mcp-server", + "name": "--with", "value_hint": "adb-mysql-mcp-server" }, { @@ -394,10 +394,10 @@ "description": "The working directory for the command", "is_required": true, "format": "string", - "value": "--directory YOUR_REPO_PATH/src/iotdb_mcp_server", - "default": "--directory YOUR_REPO_PATH/src/iotdb_mcp_server", + "value": "YOUR_REPO_PATH/src/iotdb_mcp_server", + "default": "YOUR_REPO_PATH/src/iotdb_mcp_server", "type": "named", - "name": "--directory YOUR_REPO_PATH/src/iotdb_mcp_server", + "name": "--directory", "value_hint": "YOUR_REPO_PATH/src/iotdb_mcp_server" }, { @@ -501,10 +501,10 @@ "description": "--actors lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", "is_required": true, "format": "string", - "value": "--actors lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", - "default": "--actors lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", + "value": "lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", + "default": "lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", "type": "named", - "name": "--actors lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper", + "name": "--actors", "value_hint": "lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper" } ], @@ -725,10 +725,10 @@ "description": "use repo url", "is_required": true, "format": "string", - "value": "--from git+https://github.com/ahnlabio/bicscan-mcp", - "default": "--from git+https://github.com/ahnlabio/bicscan-mcp", + "value": "git+https://github.com/ahnlabio/bicscan-mcp", + "default": "git+https://github.com/ahnlabio/bicscan-mcp", "type": "named", - "name": "--from git+https://github.com/ahnlabio/bicscan-mcp", + "name": "--from", "value_hint": "git+https://github.com/ahnlabio/bicscan-mcp" }, { @@ -782,10 +782,10 @@ "description": "source package location", "is_required": true, "format": "string", - "value": "--from git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0", - "default": "--from git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0", + "value": "git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0", + "default": "git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0", "type": "named", - "name": "--from git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0", + "name": "--from", "value_hint": "git+https://github.com/bitrise-io/bitrise-mcp@v1.1.0" }, { @@ -801,10 +801,10 @@ "description": "list of enabled API groups", "is_required": true, "format": "string", - "value": "--enabled-api-groups cache-items,pipelines", - "default": "--enabled-api-groups cache-items,pipelines", + "value": "cache-items,pipelines", + "default": "cache-items,pipelines", "type": "named", - "name": "--enabled-api-groups cache-items,pipelines", + "name": "--enabled-api-groups", "value_hint": "cache-items,pipelines" } ], @@ -959,20 +959,20 @@ "description": "Use the specified runtime feature", "is_required": true, "format": "string", - "value": "--with mcp-clickhouse", - "default": "--with mcp-clickhouse", + "value": "mcp-clickhouse", + "default": "mcp-clickhouse", "type": "named", - "name": "--with mcp-clickhouse", + "name": "--with", "value_hint": "mcp-clickhouse" }, { "description": "Specify Python version", "is_required": true, "format": "string", - "value": "--python 3.13", - "default": "--python 3.13", + "value": "3.13", + "default": "3.13", "type": "named", - "name": "--python 3.13", + "name": "--python", "value_hint": "3.13" }, { @@ -1159,40 +1159,40 @@ "description": "API URL for the opik MCP server", "is_required": true, "format": "string", - "value": "--apiUrl https://www.comet.com/opik/api", - "default": "--apiUrl https://www.comet.com/opik/api", + "value": "https://www.comet.com/opik/api", + "default": "https://www.comet.com/opik/api", "type": "named", - "name": "--apiUrl https://www.comet.com/opik/api", + "name": "--apiUrl", "value_hint": "https://www.comet.com/opik/api" }, { "description": "API Key for authentication", "is_required": true, "format": "string", - "value": "--apiKey YOUR_API_KEY", - "default": "--apiKey YOUR_API_KEY", + "value": "YOUR_API_KEY", + "default": "YOUR_API_KEY", "type": "named", - "name": "--apiKey YOUR_API_KEY", + "name": "--apiKey", "value_hint": "YOUR_API_KEY" }, { "description": "Workspace name", "is_required": true, "format": "string", - "value": "--workspace default", - "default": "--workspace default", + "value": "default", + "default": "default", "type": "named", - "name": "--workspace default", + "name": "--workspace", "value_hint": "default" }, { "description": "Enable debug mode", "is_required": true, "format": "string", - "value": "--debug true", - "default": "--debug true", + "value": "true", + "default": "true", "type": "named", - "name": "--debug true", + "name": "--debug", "value_hint": "true" } ], @@ -1245,10 +1245,10 @@ "description": "Specify directory to work in.", "is_required": true, "format": "string", - "value": "--directory path/to/cloned/repo/mcp-server-couchbase/", - "default": "--directory path/to/cloned/repo/mcp-server-couchbase/", + "value": "path/to/cloned/repo/mcp-server-couchbase/", + "default": "path/to/cloned/repo/mcp-server-couchbase/", "type": "named", - "name": "--directory path/to/cloned/repo/mcp-server-couchbase/", + "name": "--directory", "value_hint": "path/to/cloned/repo/mcp-server-couchbase/" }, { @@ -1332,10 +1332,10 @@ "description": "-e", "is_required": true, "format": "string", - "value": "-e DART_TOKEN", - "default": "-e DART_TOKEN", + "value": "DART_TOKEN", + "default": "DART_TOKEN", "type": "named", - "name": "-e DART_TOKEN", + "name": "-e", "value_hint": "DART_TOKEN" }, { @@ -1515,8 +1515,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -1524,8 +1524,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -1533,30 +1533,30 @@ "description": "-e EDUBASE_API_URL", "is_required": true, "format": "string", - "value": "-e EDUBASE_API_URL", - "default": "-e EDUBASE_API_URL", + "value": "EDUBASE_API_URL", + "default": "EDUBASE_API_URL", "type": "named", - "name": "-e EDUBASE_API_URL", + "name": "-e", "value_hint": "EDUBASE_API_URL" }, { "description": "-e EDUBASE_API_APP", "is_required": true, "format": "string", - "value": "-e EDUBASE_API_APP", - "default": "-e EDUBASE_API_APP", + "value": "EDUBASE_API_APP", + "default": "EDUBASE_API_APP", "type": "named", - "name": "-e EDUBASE_API_APP", + "name": "-e", "value_hint": "EDUBASE_API_APP" }, { "description": "-e EDUBASE_API_KEY", "is_required": true, "format": "string", - "value": "-e EDUBASE_API_KEY", - "default": "-e EDUBASE_API_KEY", + "value": "EDUBASE_API_KEY", + "default": "EDUBASE_API_KEY", "type": "named", - "name": "-e EDUBASE_API_KEY", + "name": "-e", "value_hint": "EDUBASE_API_KEY" }, { @@ -1699,10 +1699,10 @@ "description": "Comma-separated list of tools", "is_required": true, "format": "string", - "value": "--tools=web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search", - "default": "--tools=web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search", + "value": "web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search", + "default": "web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search", "type": "named", - "name": "--tools=web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search", + "name": "--tools", "value_hint": "web_search_exa,research_paper_search,company_research,crawling,competitor_finder,linkedin_search,wikipedia_search_exa,github_search" } ], @@ -1783,10 +1783,10 @@ "description": "directory to run from", "is_required": true, "format": "string", - "value": "--directory path/to/cloned/fibery-mcp-server", - "default": "--directory path/to/cloned/fibery-mcp-server", + "value": "path/to/cloned/fibery-mcp-server", + "default": "path/to/cloned/fibery-mcp-server", "type": "named", - "name": "--directory path/to/cloned/fibery-mcp-server", + "name": "--directory", "value_hint": "path/to/cloned/fibery-mcp-server" }, { @@ -1802,20 +1802,20 @@ "description": "Fibery host domain", "is_required": true, "format": "string", - "value": "--fibery-host your-domain.fibery.io", - "default": "--fibery-host your-domain.fibery.io", + "value": "your-domain.fibery.io", + "default": "your-domain.fibery.io", "type": "named", - "name": "--fibery-host your-domain.fibery.io", + "name": "--fibery-host", "value_hint": "your-domain.fibery.io" }, { "description": "Fibery API Token", "is_required": true, "format": "string", - "value": "--fibery-api-token your-api-token", - "default": "--fibery-api-token your-api-token", + "value": "your-api-token", + "default": "your-api-token", "type": "named", - "name": "--fibery-api-token your-api-token", + "name": "--fibery-api-token", "value_hint": "your-api-token" } ], @@ -1994,8 +1994,8 @@ "description": "docker named argument for stdin", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -2004,8 +2004,8 @@ "description": "docker named argument for removing the container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -2014,8 +2014,8 @@ "description": "docker named argument to set environment variable", "is_required": true, "format": "string", - "value": "-e", - "default": "-e", + "value": "", + "default": "", "type": "named", "name": "-e", "value_hint": "-e" @@ -2116,8 +2116,8 @@ "description": "Remove container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -2125,30 +2125,30 @@ "description": "Publish a container's port(s) to the host", "is_required": true, "format": "string", - "value": "-p 8000:8000", - "default": "-p 8000:8000", + "value": "8000:8000", + "default": "8000:8000", "type": "named", - "name": "-p 8000:8000", + "name": "-p", "value_hint": "8000:8000" }, { "description": "Set environment variable GRAFANA_URL", "is_required": true, "format": "string", - "value": "-e GRAFANA_URL", - "default": "-e GRAFANA_URL", + "value": "GRAFANA_URL", + "default": "GRAFANA_URL", "type": "named", - "name": "-e GRAFANA_URL", + "name": "-e", "value_hint": "GRAFANA_URL" }, { "description": "Set environment variable GRAFANA_API_KEY", "is_required": true, "format": "string", - "value": "-e GRAFANA_API_KEY", - "default": "-e GRAFANA_API_KEY", + "value": "GRAFANA_API_KEY", + "default": "GRAFANA_API_KEY", "type": "named", - "name": "-e GRAFANA_API_KEY", + "name": "-e", "value_hint": "GRAFANA_API_KEY" }, { @@ -2163,8 +2163,8 @@ { "description": "Enable debug mode", "format": "string", - "value": "-debug", - "default": "-debug", + "value": "", + "default": "", "type": "named", "name": "-debug" } @@ -2454,20 +2454,20 @@ "description": "Directory for the inkeep-mcp-server", "is_required": true, "format": "string", - "value": "--directory \u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e", - "default": "--directory \u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e", + "value": "\u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e", + "default": "\u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e", "type": "named", - "name": "--directory \u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e", + "name": "--directory", "value_hint": "\u003cYOUR_INKEEP_MCP_SERVER_ABSOLUTE_PATH\u003e" }, { "description": "Run python module", "is_required": true, "format": "string", - "value": "-m inkeep_mcp_server", - "default": "-m inkeep_mcp_server", + "value": "inkeep_mcp_server", + "default": "inkeep_mcp_server", "type": "named", - "name": "-m inkeep_mcp_server", + "name": "-m", "value_hint": "inkeep_mcp_server" } ], @@ -2604,10 +2604,10 @@ "description": "Specifies the working directory", "is_required": true, "format": "string", - "value": "--directory /ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp", - "default": "--directory /ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp", + "value": "/ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp", + "default": "/ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp", "type": "named", - "name": "--directory /ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp", + "name": "--directory", "value_hint": "/ABSOLUTE/PATH/TO/PARENT/FOLDER/kagimcp" }, { @@ -2674,20 +2674,20 @@ "description": "Specify the transport type", "is_required": true, "format": "string", - "value": "--transport stdio", - "default": "--transport stdio", + "value": "stdio", + "default": "stdio", "type": "named", - "name": "--transport stdio", + "name": "--transport", "value_hint": "stdio" }, { "description": "API URL for Keboola Connection", "is_required": true, "format": "string", - "value": "--api-url https://connection.YOUR_REGION.keboola.com", - "default": "--api-url https://connection.YOUR_REGION.keboola.com", + "value": "https://connection.YOUR_REGION.keboola.com", + "default": "https://connection.YOUR_REGION.keboola.com", "type": "named", - "name": "--api-url https://connection.YOUR_REGION.keboola.com", + "name": "--api-url", "value_hint": "https://connection.YOUR_REGION.keboola.com" } ], @@ -2736,8 +2736,8 @@ "description": "Run the docker container in interactive mode", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -2745,8 +2745,8 @@ "description": "Automatically remove the container when it exits", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -2754,20 +2754,20 @@ "description": "Set environment variable LARA_ACCESS_KEY_ID in the container", "is_required": true, "format": "string", - "value": "-e LARA_ACCESS_KEY_ID", - "default": "-e LARA_ACCESS_KEY_ID", + "value": "LARA_ACCESS_KEY_ID", + "default": "LARA_ACCESS_KEY_ID", "type": "named", - "name": "-e LARA_ACCESS_KEY_ID", + "name": "-e", "value_hint": "LARA_ACCESS_KEY_ID" }, { "description": "Set environment variable LARA_ACCESS_KEY_SECRET in the container", "is_required": true, "format": "string", - "value": "-e LARA_ACCESS_KEY_SECRET", - "default": "-e LARA_ACCESS_KEY_SECRET", + "value": "LARA_ACCESS_KEY_SECRET", + "default": "LARA_ACCESS_KEY_SECRET", "type": "named", - "name": "-e LARA_ACCESS_KEY_SECRET", + "name": "-e", "value_hint": "LARA_ACCESS_KEY_SECRET" } ], @@ -2816,18 +2816,18 @@ "description": "SELECT trace_id, message, created_at, attributes-\u003e\u003e'service.name' as service FROM records WHERE severity_text = 'ERROR' ORDER BY created_at DESC LIMIT 10", "is_required": true, "format": "string", - "value": "SELECT trace_id, message, created_at, attributes-\u003e\u003e'service.name' as service FROM records WHERE severity_text = 'ERROR' ORDER BY created_at DESC LIMIT 10", - "default": "SELECT trace_id, message, created_at, attributes-\u003e\u003e'service.name' as service FROM records WHERE severity_text = 'ERROR' ORDER BY created_at DESC LIMIT 10", + "value": "", + "default": "", "type": "named", - "name": "SELECT trace_id, message, created_at, attributes-\u003e\u003e'service.name' as service FROM records WHERE severity_text = 'ERROR' ORDER BY created_at DESC LIMIT 10", + "name": "SELECT", "value_hint": "SELECT trace_id, message, created_at, attributes-\u003e\u003e'service.name' as service FROM records WHERE severity_text = 'ERROR' ORDER BY created_at DESC LIMIT 10" }, { "description": "1440", "is_required": true, "format": "string", - "value": "1440", - "default": "1440", + "value": "", + "default": "", "type": "named", "name": "1440", "value_hint": "1440" @@ -3046,10 +3046,10 @@ "description": "Directory argument", "is_required": true, "format": "string", - "value": "--directory /path/to/mcp-server-milvus/src/mcp_server_milvus", - "default": "--directory /path/to/mcp-server-milvus/src/mcp_server_milvus", + "value": "/path/to/mcp-server-milvus/src/mcp_server_milvus", + "default": "/path/to/mcp-server-milvus/src/mcp_server_milvus", "type": "named", - "name": "--directory /path/to/mcp-server-milvus/src/mcp_server_milvus", + "name": "--directory", "value_hint": "/path/to/mcp-server-milvus/src/mcp_server_milvus" }, { @@ -3065,10 +3065,10 @@ "description": "Milvus URI", "is_required": true, "format": "string", - "value": "--milvus-uri http://127.0.0.1:19530", - "default": "--milvus-uri http://127.0.0.1:19530", + "value": "http://127.0.0.1:19530", + "default": "http://127.0.0.1:19530", "type": "named", - "name": "--milvus-uri http://127.0.0.1:19530", + "name": "--milvus-uri", "value_hint": "http://127.0.0.1:19530" } ], @@ -3151,20 +3151,20 @@ "description": "your-atlas-service-accounts-client-id", "is_required": true, "format": "string", - "value": "--apiClientId your-atlas-service-accounts-client-id", - "default": "--apiClientId your-atlas-service-accounts-client-id", + "value": "your-atlas-service-accounts-client-id", + "default": "your-atlas-service-accounts-client-id", "type": "named", - "name": "--apiClientId your-atlas-service-accounts-client-id", + "name": "--apiClientId", "value_hint": "your-atlas-service-accounts-client-id" }, { "description": "your-atlas-service-accounts-client-secret", "is_required": true, "format": "string", - "value": "--apiClientSecret your-atlas-service-accounts-client-secret", - "default": "--apiClientSecret your-atlas-service-accounts-client-secret", + "value": "your-atlas-service-accounts-client-secret", + "default": "your-atlas-service-accounts-client-secret", "type": "named", - "name": "--apiClientSecret your-atlas-service-accounts-client-secret", + "name": "--apiClientSecret", "value_hint": "your-atlas-service-accounts-client-secret" } ], @@ -3203,10 +3203,10 @@ "description": "--directory /path/to/your/local/mcp-server-motherduck", "is_required": true, "format": "string", - "value": "--directory /path/to/your/local/mcp-server-motherduck", - "default": "--directory /path/to/your/local/mcp-server-motherduck", + "value": "/path/to/your/local/mcp-server-motherduck", + "default": "/path/to/your/local/mcp-server-motherduck", "type": "named", - "name": "--directory /path/to/your/local/mcp-server-motherduck", + "name": "--directory", "value_hint": "/path/to/your/local/mcp-server-motherduck" }, { @@ -3222,20 +3222,20 @@ "description": "--db-path md:", "is_required": true, "format": "string", - "value": "--db-path md:", - "default": "--db-path md:", + "value": "md:", + "default": "md:", "type": "named", - "name": "--db-path md:", + "name": "--db-path", "value_hint": "md:" }, { "description": "--motherduck-token \u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", "is_required": true, "format": "string", - "value": "--motherduck-token \u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", - "default": "--motherduck-token \u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", + "value": "\u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", + "default": "\u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", "type": "named", - "name": "--motherduck-token \u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e", + "name": "--motherduck-token", "value_hint": "\u003cYOUR_MOTHERDUCK_TOKEN_HERE\u003e" } ], @@ -3446,10 +3446,10 @@ "description": "Set the working directory", "is_required": true, "format": "string", - "value": "--directory /\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp", - "default": "--directory /\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp", + "value": "/\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp", + "default": "/\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp", "type": "named", - "name": "--directory /\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp", + "name": "--directory", "value_hint": "/\u003cAbsolute-path-to-folder\u003e/oxylabs-mcp" }, { @@ -3624,8 +3624,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -3633,8 +3633,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -3642,20 +3642,20 @@ "description": "-e PINECONE_API_KEY", "is_required": true, "format": "string", - "value": "-e PINECONE_API_KEY", - "default": "-e PINECONE_API_KEY", + "value": "PINECONE_API_KEY", + "default": "PINECONE_API_KEY", "type": "named", - "name": "-e PINECONE_API_KEY", + "name": "-e", "value_hint": "PINECONE_API_KEY" }, { "description": "-e PINECONE_ASSISTANT_HOST", "is_required": true, "format": "string", - "value": "-e PINECONE_ASSISTANT_HOST", - "default": "-e PINECONE_ASSISTANT_HOST", + "value": "PINECONE_ASSISTANT_HOST", + "default": "PINECONE_ASSISTANT_HOST", "type": "named", - "name": "-e PINECONE_ASSISTANT_HOST", + "name": "-e", "value_hint": "PINECONE_ASSISTANT_HOST" }, { @@ -3713,10 +3713,10 @@ "description": "Partition identifier (optional)", "is_required": true, "format": "string", - "value": "--partition optional_partition_id", - "default": "--partition optional_partition_id", + "value": "optional_partition_id", + "default": "optional_partition_id", "type": "named", - "name": "--partition optional_partition_id", + "name": "--partition", "value_hint": "optional_partition_id" } ], @@ -3797,8 +3797,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -3807,8 +3807,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -3817,20 +3817,20 @@ "description": "-e API_KEY=\u003cyour_redis_cloud_api_key\u003e", "is_required": true, "format": "string", - "value": "-e API_KEY=\u003cyour_redis_cloud_api_key\u003e", - "default": "-e API_KEY=\u003cyour_redis_cloud_api_key\u003e", + "value": "API_KEY=\u003cyour_redis_cloud_api_key\u003e", + "default": "API_KEY=\u003cyour_redis_cloud_api_key\u003e", "type": "named", - "name": "-e API_KEY=\u003cyour_redis_cloud_api_key\u003e", + "name": "-e", "value_hint": "API_KEY=\u003cyour_redis_cloud_api_key\u003e" }, { "description": "-e SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", "is_required": true, "format": "string", - "value": "-e SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", - "default": "-e SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", + "value": "SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", + "default": "SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", "type": "named", - "name": "-e SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e", + "name": "-e", "value_hint": "SECRET_KEY=\u003cyour_redis_cloud_api_secret_key\u003e" } ], @@ -3869,18 +3869,18 @@ "description": "Publish port 8000:8000", "is_required": true, "format": "string", - "value": "-p 8000:8000", - "default": "-p 8000:8000", + "value": "8000:8000", + "default": "8000:8000", "type": "named", - "name": "-p 8000:8000", + "name": "-p", "value_hint": "8000:8000" }, { "description": "Run in interactive mode", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -3888,8 +3888,8 @@ "description": "Remove container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -3897,30 +3897,30 @@ "description": "Set environment variable QDRANT_URL", "is_required": true, "format": "string", - "value": "-e QDRANT_URL", - "default": "-e QDRANT_URL", + "value": "QDRANT_URL", + "default": "QDRANT_URL", "type": "named", - "name": "-e QDRANT_URL", + "name": "-e", "value_hint": "QDRANT_URL" }, { "description": "Set environment variable QDRANT_API_KEY", "is_required": true, "format": "string", - "value": "-e QDRANT_API_KEY", - "default": "-e QDRANT_API_KEY", + "value": "QDRANT_API_KEY", + "default": "QDRANT_API_KEY", "type": "named", - "name": "-e QDRANT_API_KEY", + "name": "-e", "value_hint": "QDRANT_API_KEY" }, { "description": "Set environment variable COLLECTION_NAME", "is_required": true, "format": "string", - "value": "-e COLLECTION_NAME", - "default": "-e COLLECTION_NAME", + "value": "COLLECTION_NAME", + "default": "COLLECTION_NAME", "type": "named", - "name": "-e COLLECTION_NAME", + "name": "-e", "value_hint": "COLLECTION_NAME" }, { @@ -3982,10 +3982,10 @@ "description": "Specify the directory to use", "is_required": true, "format": "string", - "value": "--directory /\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp", - "default": "--directory /\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp", + "value": "/\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp", + "default": "/\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp", "type": "named", - "name": "--directory /\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp", + "name": "--directory", "value_hint": "/\u003cABSOLUTE-PATH-TO\u003e/ramp-mcp" }, { @@ -4001,8 +4001,8 @@ "description": "Run in silent mode", "is_required": true, "format": "string", - "value": "-s", - "default": "-s", + "value": "", + "default": "", "type": "named", "name": "-s" }, @@ -4101,10 +4101,10 @@ "description": "Rember API Key", "is_required": true, "format": "string", - "value": "--api-key=YOUR_REMBER_API_KEY", - "default": "--api-key=YOUR_REMBER_API_KEY", + "value": "YOUR_REMBER_API_KEY", + "default": "YOUR_REMBER_API_KEY", "type": "named", - "name": "--api-key=YOUR_REMBER_API_KEY", + "name": "--api-key", "value_hint": "YOUR_REMBER_API_KEY" } ], @@ -4438,10 +4438,10 @@ "description": "Directory to use", "is_required": true, "format": "string", - "value": "--directory ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp", - "default": "--directory ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp", + "value": "ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp", + "default": "ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp", "type": "named", - "name": "--directory ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp", + "name": "--directory", "value_hint": "ABSOLUTE/PATH/TO/YOUR-UNS-MCP-REPO/uns_mcp" }, { @@ -4489,18 +4489,18 @@ "description": "Generate a financial status report about the company", "is_required": true, "format": "string", - "value": "Generate a financial status report about the company", - "default": "Generate a financial status report about the company", + "value": "", + "default": "", "type": "named", - "name": "Generate a financial status report about the company", + "name": "Generate", "value_hint": "Generate a financial status report about the company" }, { "description": "true", "is_required": true, "format": "string", - "value": "true", - "default": "true", + "value": "", + "default": "", "type": "named", "name": "true", "value_hint": "true" @@ -4800,8 +4800,8 @@ "description": "Ignore robots.txt directives", "is_required": true, "format": "string", - "value": "--ignore-robots-txt", - "default": "--ignore-robots-txt", + "value": "", + "default": "", "type": "named", "name": "--ignore-robots-txt" } @@ -4911,10 +4911,10 @@ "description": "Directory to run the server from", "is_required": true, "format": "string", - "value": "--directory /path/to/mcp-server-apache-airflow", - "default": "--directory /path/to/mcp-server-apache-airflow", + "value": "/path/to/mcp-server-apache-airflow", + "default": "/path/to/mcp-server-apache-airflow", "type": "named", - "name": "--directory /path/to/mcp-server-apache-airflow", + "name": "--directory", "value_hint": "/path/to/mcp-server-apache-airflow" }, { @@ -5119,40 +5119,40 @@ "description": "Set working directory", "is_required": true, "format": "string", - "value": "--directory /Users/user/workspace/mcp-server-gravitino", - "default": "--directory /Users/user/workspace/mcp-server-gravitino", + "value": "/Users/user/workspace/mcp-server-gravitino", + "default": "/Users/user/workspace/mcp-server-gravitino", "type": "named", - "name": "--directory /Users/user/workspace/mcp-server-gravitino", + "name": "--directory", "value_hint": "/Users/user/workspace/mcp-server-gravitino" }, { "description": "Add fastmcp", "is_required": true, "format": "string", - "value": "--with fastmcp", - "default": "--with fastmcp", + "value": "fastmcp", + "default": "fastmcp", "type": "named", - "name": "--with fastmcp", + "name": "--with", "value_hint": "fastmcp" }, { "description": "Add httpx", "is_required": true, "format": "string", - "value": "--with httpx", - "default": "--with httpx", + "value": "httpx", + "default": "httpx", "type": "named", - "name": "--with httpx", + "name": "--with", "value_hint": "httpx" }, { "description": "Add mcp-server-gravitino", "is_required": true, "format": "string", - "value": "--with mcp-server-gravitino", - "default": "--with mcp-server-gravitino", + "value": "mcp-server-gravitino", + "default": "mcp-server-gravitino", "type": "named", - "name": "--with mcp-server-gravitino", + "name": "--with", "value_hint": "mcp-server-gravitino" }, { @@ -5168,10 +5168,10 @@ "description": "Run module", "is_required": true, "format": "string", - "value": "-m mcp_server_gravitino.server", - "default": "-m mcp_server_gravitino.server", + "value": "mcp_server_gravitino.server", + "default": "mcp_server_gravitino.server", "type": "named", - "name": "-m mcp_server_gravitino.server", + "name": "-m", "value_hint": "mcp_server_gravitino.server" } ], @@ -5298,10 +5298,10 @@ "description": "Directory flag and its value", "is_required": true, "format": "string", - "value": "--directory {{PATH_TO_SRC}}/aranet4-mcp-server/", - "default": "--directory {{PATH_TO_SRC}}/aranet4-mcp-server/", + "value": "{{PATH_TO_SRC}}/aranet4-mcp-server/", + "default": "{{PATH_TO_SRC}}/aranet4-mcp-server/", "type": "named", - "name": "--directory {{PATH_TO_SRC}}/aranet4-mcp-server/", + "name": "--directory", "value_hint": "{{PATH_TO_SRC}}/aranet4-mcp-server/" }, { @@ -5523,20 +5523,20 @@ "description": "Named argument for query identifier", "is_required": true, "format": "string", - "value": "--namedQueryId abcd-1234-efgh-5678", - "default": "--namedQueryId abcd-1234-efgh-5678", + "value": "abcd-1234-efgh-5678", + "default": "abcd-1234-efgh-5678", "type": "named", - "name": "--namedQueryId abcd-1234-efgh-5678", + "name": "--namedQueryId", "value_hint": "abcd-1234-efgh-5678" }, { "description": "Named argument for maximum rows", "is_required": true, "format": "string", - "value": "--maxRows 100", - "default": "--maxRows 100", + "value": "100", + "default": "100", "type": "named", - "name": "--maxRows 100", + "name": "--maxRows", "value_hint": "100" } ], @@ -5575,10 +5575,10 @@ "description": "Path to the directory.", "is_required": true, "format": "string", - "value": "--directory /path/to/aws-cost-explorer-mcp-server", - "default": "--directory /path/to/aws-cost-explorer-mcp-server", + "value": "/path/to/aws-cost-explorer-mcp-server", + "default": "/path/to/aws-cost-explorer-mcp-server", "type": "named", - "name": "--directory /path/to/aws-cost-explorer-mcp-server", + "name": "--directory", "value_hint": "/path/to/aws-cost-explorer-mcp-server" }, { @@ -5652,8 +5652,8 @@ "description": "Keep STDIN open even if not attached", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -5661,8 +5661,8 @@ "description": "Automatically remove the container when it exits", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -5670,20 +5670,20 @@ "description": "Set environment variables in the container", "is_required": true, "format": "string", - "value": "-e AWS_PROFILE=default", - "default": "-e AWS_PROFILE=default", + "value": "AWS_PROFILE=default", + "default": "AWS_PROFILE=default", "type": "named", - "name": "-e AWS_PROFILE=default", + "name": "-e", "value_hint": "AWS_PROFILE=default" }, { "description": "Bind mount a volume", "is_required": true, "format": "string", - "value": "-v ~/.aws:/root/.aws", - "default": "-v ~/.aws:/root/.aws", + "value": "~/.aws:/root/.aws", + "default": "~/.aws:/root/.aws", "type": "named", - "name": "-v ~/.aws:/root/.aws", + "name": "-v", "value_hint": "~/.aws:/root/.aws" }, { @@ -5761,8 +5761,8 @@ "description": "Remove container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -5771,8 +5771,8 @@ "description": "Keep STDIN open even if not attached", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -5781,50 +5781,50 @@ "description": "Set environment variable in container: ADX_CLUSTER_URL", "is_required": true, "format": "string", - "value": "-e ADX_CLUSTER_URL", - "default": "-e ADX_CLUSTER_URL", + "value": "ADX_CLUSTER_URL", + "default": "ADX_CLUSTER_URL", "type": "named", - "name": "-e ADX_CLUSTER_URL", + "name": "-e", "value_hint": "ADX_CLUSTER_URL" }, { "description": "Set environment variable in container: ADX_DATABASE", "is_required": true, "format": "string", - "value": "-e ADX_DATABASE", - "default": "-e ADX_DATABASE", + "value": "ADX_DATABASE", + "default": "ADX_DATABASE", "type": "named", - "name": "-e ADX_DATABASE", + "name": "-e", "value_hint": "ADX_DATABASE" }, { "description": "Set environment variable in container: AZURE_TENANT_ID", "is_required": true, "format": "string", - "value": "-e AZURE_TENANT_ID", - "default": "-e AZURE_TENANT_ID", + "value": "AZURE_TENANT_ID", + "default": "AZURE_TENANT_ID", "type": "named", - "name": "-e AZURE_TENANT_ID", + "name": "-e", "value_hint": "AZURE_TENANT_ID" }, { "description": "Set environment variable in container: AZURE_CLIENT_ID", "is_required": true, "format": "string", - "value": "-e AZURE_CLIENT_ID", - "default": "-e AZURE_CLIENT_ID", + "value": "AZURE_CLIENT_ID", + "default": "AZURE_CLIENT_ID", "type": "named", - "name": "-e AZURE_CLIENT_ID", + "name": "-e", "value_hint": "AZURE_CLIENT_ID" }, { "description": "Set environment variable in container: ADX_TOKEN_FILE_PATH", "is_required": true, "format": "string", - "value": "-e ADX_TOKEN_FILE_PATH", - "default": "-e ADX_TOKEN_FILE_PATH", + "value": "ADX_TOKEN_FILE_PATH", + "default": "ADX_TOKEN_FILE_PATH", "type": "named", - "name": "-e ADX_TOKEN_FILE_PATH", + "name": "-e", "value_hint": "ADX_TOKEN_FILE_PATH" }, { @@ -6070,30 +6070,30 @@ "description": "--project-id your-project-id", "is_required": true, "format": "string", - "value": "--project-id your-project-id", - "default": "--project-id your-project-id", + "value": "your-project-id", + "default": "your-project-id", "type": "named", - "name": "--project-id your-project-id", + "name": "--project-id", "value_hint": "your-project-id" }, { "description": "--location us-central1", "is_required": true, "format": "string", - "value": "--location us-central1", - "default": "--location us-central1", + "value": "us-central1", + "default": "us-central1", "type": "named", - "name": "--location us-central1", + "name": "--location", "value_hint": "us-central1" }, { "description": "--key-file /path/to/service-account-key.json", "is_required": true, "format": "string", - "value": "--key-file /path/to/service-account-key.json", - "default": "--key-file /path/to/service-account-key.json", + "value": "/path/to/service-account-key.json", + "default": "/path/to/service-account-key.json", "type": "named", - "name": "--key-file /path/to/service-account-key.json", + "name": "--key-file", "value_hint": "/path/to/service-account-key.json" } ], @@ -6168,10 +6168,10 @@ "description": "-m bitable_mcp", "is_required": true, "format": "string", - "value": "-m bitable_mcp", - "default": "-m bitable_mcp", + "value": "bitable_mcp", + "default": "bitable_mcp", "type": "named", - "name": "-m bitable_mcp", + "name": "-m", "value_hint": "bitable_mcp" } ], @@ -6307,18 +6307,18 @@ "description": "--port 8000", "is_required": true, "format": "string", - "value": "--port 8000", - "default": "--port 8000", + "value": "8000", + "default": "8000", "type": "named", - "name": "--port 8000", + "name": "--port", "value_hint": "8000" }, { "description": "--stdio", "is_required": true, "format": "string", - "value": "--stdio", - "default": "--stdio", + "value": "", + "default": "", "type": "named", "name": "--stdio" }, @@ -6326,10 +6326,10 @@ "description": "--proxy-port 9000", "is_required": true, "format": "string", - "value": "--proxy-port 9000", - "default": "--proxy-port 9000", + "value": "9000", + "default": "9000", "type": "named", - "name": "--proxy-port 9000", + "name": "--proxy-port", "value_hint": "9000" } ], @@ -6561,10 +6561,10 @@ "description": "The directory to use for the operation", "is_required": true, "format": "string", - "value": "--directory \u003cfull path to chess-mcp directory\u003e", - "default": "--directory \u003cfull path to chess-mcp directory\u003e", + "value": "\u003cfull path to chess-mcp directory\u003e", + "default": "\u003cfull path to chess-mcp directory\u003e", "type": "named", - "name": "--directory \u003cfull path to chess-mcp directory\u003e", + "name": "--directory", "value_hint": "\u003cfull path to chess-mcp directory\u003e" }, { @@ -6612,10 +6612,10 @@ "description": "Named argument", "is_required": true, "format": "string", - "value": "--directory C:/MCP/server/community/chroma", - "default": "--directory C:/MCP/server/community/chroma", + "value": "C:/MCP/server/community/chroma", + "default": "C:/MCP/server/community/chroma", "type": "named", - "name": "--directory C:/MCP/server/community/chroma", + "name": "--directory", "value_hint": "C:/MCP/server/community/chroma" }, { @@ -6663,10 +6663,10 @@ "description": "Directory to execute the command in", "is_required": true, "format": "string", - "value": "--directory /path/to/claude-post/src/email_client", - "default": "--directory /path/to/claude-post/src/email_client", + "value": "/path/to/claude-post/src/email_client", + "default": "/path/to/claude-post/src/email_client", "type": "named", - "name": "--directory /path/to/claude-post/src/email_client", + "name": "--directory", "value_hint": "/path/to/claude-post/src/email_client" }, { @@ -6918,10 +6918,10 @@ "description": "-m coin_api_mcp", "is_required": true, "format": "string", - "value": "-m coin_api_mcp", - "default": "-m coin_api_mcp", + "value": "coin_api_mcp", + "default": "coin_api_mcp", "type": "named", - "name": "-m coin_api_mcp", + "name": "-m", "value_hint": "coin_api_mcp" } ], @@ -6996,38 +6996,38 @@ "description": "Pass environment variable MACOS_USERNAME", "is_required": true, "format": "string", - "value": "-e MACOS_USERNAME=your_macos_username", - "default": "-e MACOS_USERNAME=your_macos_username", + "value": "MACOS_USERNAME=your_macos_username", + "default": "MACOS_USERNAME=your_macos_username", "type": "named", - "name": "-e MACOS_USERNAME=your_macos_username", + "name": "-e", "value_hint": "MACOS_USERNAME=your_macos_username" }, { "description": "Pass environment variable MACOS_PASSWORD", "is_required": true, "format": "string", - "value": "-e MACOS_PASSWORD=your_macos_password", - "default": "-e MACOS_PASSWORD=your_macos_password", + "value": "MACOS_PASSWORD=your_macos_password", + "default": "MACOS_PASSWORD=your_macos_password", "type": "named", - "name": "-e MACOS_PASSWORD=your_macos_password", + "name": "-e", "value_hint": "MACOS_PASSWORD=your_macos_password" }, { "description": "Pass environment variable MACOS_HOST", "is_required": true, "format": "string", - "value": "-e MACOS_HOST=your_macos_hostname_or_ip", - "default": "-e MACOS_HOST=your_macos_hostname_or_ip", + "value": "MACOS_HOST=your_macos_hostname_or_ip", + "default": "MACOS_HOST=your_macos_hostname_or_ip", "type": "named", - "name": "-e MACOS_HOST=your_macos_hostname_or_ip", + "name": "-e", "value_hint": "MACOS_HOST=your_macos_hostname_or_ip" }, { "description": "Remove container when it exits", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -7077,20 +7077,20 @@ "description": "Management token for Contentful", "is_required": true, "format": "string", - "value": "--management-token \u003cyour token\u003e", - "default": "--management-token \u003cyour token\u003e", + "value": "\u003cyour token\u003e", + "default": "\u003cyour token\u003e", "type": "named", - "name": "--management-token \u003cyour token\u003e", + "name": "--management-token", "value_hint": "\u003cyour token\u003e" }, { "description": "Contentful API host address", "is_required": true, "format": "string", - "value": "--host http://api.contentful.com", - "default": "--host http://api.contentful.com", + "value": "http://api.contentful.com", + "default": "http://api.contentful.com", "type": "named", - "name": "--host http://api.contentful.com", + "name": "--host", "value_hint": "http://api.contentful.com" } ], @@ -7308,50 +7308,50 @@ "description": "\u003cYOUR_API_KEY\u003e", "is_required": true, "format": "string", - "value": "--apiKey \u003cYOUR_API_KEY\u003e", - "default": "--apiKey \u003cYOUR_API_KEY\u003e", + "value": "\u003cYOUR_API_KEY\u003e", + "default": "\u003cYOUR_API_KEY\u003e", "type": "named", - "name": "--apiKey \u003cYOUR_API_KEY\u003e", + "name": "--apiKey", "value_hint": "\u003cYOUR_API_KEY\u003e" }, { "description": "\u003cYOUR_APP_KEY\u003e", "is_required": true, "format": "string", - "value": "--appKey \u003cYOUR_APP_KEY\u003e", - "default": "--appKey \u003cYOUR_APP_KEY\u003e", + "value": "\u003cYOUR_APP_KEY\u003e", + "default": "\u003cYOUR_APP_KEY\u003e", "type": "named", - "name": "--appKey \u003cYOUR_APP_KEY\u003e", + "name": "--appKey", "value_hint": "\u003cYOUR_APP_KEY\u003e" }, { "description": "\u003cYOUR_DD_SITE\u003e", "is_required": true, "format": "string", - "value": "--site \u003cYOUR_DD_SITE\u003e", - "default": "--site \u003cYOUR_DD_SITE\u003e", + "value": "\u003cYOUR_DD_SITE\u003e", + "default": "\u003cYOUR_DD_SITE\u003e", "type": "named", - "name": "--site \u003cYOUR_DD_SITE\u003e", + "name": "--site", "value_hint": "\u003cYOUR_DD_SITE\u003e" }, { "description": "\u003cYOUR_LOGS_SITE\u003e", "is_required": true, "format": "string", - "value": "--logsSite \u003cYOUR_LOGS_SITE\u003e", - "default": "--logsSite \u003cYOUR_LOGS_SITE\u003e", + "value": "\u003cYOUR_LOGS_SITE\u003e", + "default": "\u003cYOUR_LOGS_SITE\u003e", "type": "named", - "name": "--logsSite \u003cYOUR_LOGS_SITE\u003e", + "name": "--logsSite", "value_hint": "\u003cYOUR_LOGS_SITE\u003e" }, { "description": "\u003cYOUR_METRICS_SITE\u003e", "is_required": true, "format": "string", - "value": "--metricsSite \u003cYOUR_METRICS_SITE\u003e", - "default": "--metricsSite \u003cYOUR_METRICS_SITE\u003e", + "value": "\u003cYOUR_METRICS_SITE\u003e", + "default": "\u003cYOUR_METRICS_SITE\u003e", "type": "named", - "name": "--metricsSite \u003cYOUR_METRICS_SITE\u003e", + "name": "--metricsSite", "value_hint": "\u003cYOUR_METRICS_SITE\u003e" } ], @@ -7490,18 +7490,18 @@ "description": "--experimental-specifier-resolution=node", "is_required": true, "format": "string", - "value": "--experimental-specifier-resolution=node", - "default": "--experimental-specifier-resolution=node", + "value": "node", + "default": "node", "type": "named", - "name": "--experimental-specifier-resolution=node", + "name": "--experimental-specifier-resolution", "value_hint": "node" }, { "description": "--experimental-modules", "is_required": true, "format": "string", - "value": "--experimental-modules", - "default": "--experimental-modules", + "value": "", + "default": "", "type": "named", "name": "--experimental-modules" }, @@ -7509,10 +7509,10 @@ "description": "--max-old-space-size=4096", "is_required": true, "format": "string", - "value": "--max-old-space-size=4096", - "default": "--max-old-space-size=4096", + "value": "4096", + "default": "4096", "type": "named", - "name": "--max-old-space-size=4096", + "name": "--max-old-space-size", "value_hint": "4096" }, { @@ -7801,10 +7801,10 @@ "description": "Specify the directory to operate in", "is_required": true, "format": "string", - "value": "--directory path/to/cloned/dicom-mcp", - "default": "--directory path/to/cloned/dicom-mcp", + "value": "path/to/cloned/dicom-mcp", + "default": "path/to/cloned/dicom-mcp", "type": "named", - "name": "--directory path/to/cloned/dicom-mcp", + "name": "--directory", "value_hint": "path/to/cloned/dicom-mcp" }, { @@ -7861,10 +7861,10 @@ "description": "Directory path to operate in", "is_required": true, "format": "string", - "value": "--directory /Users/lyx/Downloads/dify-mcp-server", - "default": "--directory /Users/lyx/Downloads/dify-mcp-server", + "value": "/Users/lyx/Downloads/dify-mcp-server", + "default": "/Users/lyx/Downloads/dify-mcp-server", "type": "named", - "name": "--directory /Users/lyx/Downloads/dify-mcp-server", + "name": "--directory", "value_hint": "/Users/lyx/Downloads/dify-mcp-server" }, { @@ -8223,10 +8223,10 @@ "description": "Flag to specify a directory for the server", "is_required": true, "format": "string", - "value": "--directory path/to/elevenlabs-mcp-server", - "default": "--directory path/to/elevenlabs-mcp-server", + "value": "path/to/elevenlabs-mcp-server", + "default": "path/to/elevenlabs-mcp-server", "type": "named", - "name": "--directory path/to/elevenlabs-mcp-server", + "name": "--directory", "value_hint": "path/to/elevenlabs-mcp-server" }, { @@ -8400,10 +8400,10 @@ "description": "Sets the directory to operate from.", "is_required": true, "format": "string", - "value": "--directory /path/to/mcp-everything-search/src/mcp_server_everything_search", - "default": "--directory /path/to/mcp-everything-search/src/mcp_server_everything_search", + "value": "/path/to/mcp-everything-search/src/mcp_server_everything_search", + "default": "/path/to/mcp-everything-search/src/mcp_server_everything_search", "type": "named", - "name": "--directory /path/to/mcp-everything-search/src/mcp_server_everything_search", + "name": "--directory", "value_hint": "/path/to/mcp-everything-search/src/mcp_server_everything_search" }, { @@ -8635,18 +8635,18 @@ "description": "Figma API Key flag", "is_required": true, "format": "string", - "value": "--figma-api-key=YOUR-KEY", - "default": "--figma-api-key=YOUR-KEY", + "value": "YOUR-KEY", + "default": "YOUR-KEY", "type": "named", - "name": "--figma-api-key=YOUR-KEY", + "name": "--figma-api-key", "value_hint": "YOUR-KEY" }, { "description": "stdio mode", "is_required": true, "format": "string", - "value": "--stdio", - "default": "--stdio", + "value": "", + "default": "", "type": "named", "name": "--stdio" } @@ -8977,39 +8977,39 @@ "description": "Recipient email address", "is_required": true, "format": "string", - "value": "recipient@example.com", - "default": "recipient@example.com", + "value": "", + "default": "", "type": "named", - "name": "recipient@example.com", + "name": "--recipient", "value_hint": "recipient@example.com" }, { "description": "Email subject", "is_required": true, "format": "string", - "value": "Hello from MCP Gmail", - "default": "Hello from MCP Gmail", + "value": "", + "default": "", "type": "named", - "name": "Hello from MCP Gmail", + "name": "--subject", "value_hint": "Hello from MCP Gmail" }, { "description": "Plain text email body", "is_required": true, "format": "string", - "value": "This is a test email sent via MCP Gmail server", - "default": "This is a test email sent via MCP Gmail server", + "value": "", + "default": "", "type": "named", - "name": "This is a test email sent via MCP Gmail server", + "name": "--text-body", "value_hint": "This is a test email sent via MCP Gmail server" }, { "description": "HTML email body", "format": "string", - "value": "\u003cp\u003eThis is a \u003cstrong\u003etest email\u003c/strong\u003e sent via MCP Gmail server\u003c/p\u003e", - "default": "\u003cp\u003eThis is a \u003cstrong\u003etest email\u003c/strong\u003e sent via MCP Gmail server\u003c/p\u003e", + "value": "", + "default": "", "type": "named", - "name": "\u003cp\u003eThis is a \u003cstrong\u003etest email\u003c/strong\u003e sent via MCP Gmail server\u003c/p\u003e", + "name": "--html-body", "value_hint": "\u003cp\u003eThis is a \u003cstrong\u003etest email\u003c/strong\u003e sent via MCP Gmail server\u003c/p\u003e" } ], @@ -9200,10 +9200,10 @@ "description": "Path to the source directory", "is_required": true, "format": "string", - "value": "--directory \u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews", - "default": "--directory \u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews", + "value": "\u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews", + "default": "\u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews", "type": "named", - "name": "--directory \u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews", + "name": "--directory", "value_hint": "\u003cabsolute-path-to-cloned-repo\u003e/mcp-goodnews/src/mcp_goodnews" }, { @@ -9690,8 +9690,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -9699,8 +9699,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -9708,20 +9708,20 @@ "description": "-e HA_URL", "is_required": true, "format": "string", - "value": "-e HA_URL", - "default": "-e HA_URL", + "value": "HA_URL", + "default": "HA_URL", "type": "named", - "name": "-e HA_URL", + "name": "-e", "value_hint": "HA_URL" }, { "description": "-e HA_TOKEN", "is_required": true, "format": "string", - "value": "-e HA_TOKEN", - "default": "-e HA_TOKEN", + "value": "HA_TOKEN", + "default": "HA_TOKEN", "type": "named", - "name": "-e HA_TOKEN", + "name": "-e", "value_hint": "HA_TOKEN" }, { @@ -9779,8 +9779,8 @@ "description": "Attach stdin even if not attached", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -9789,8 +9789,8 @@ "description": "Remove container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -9799,19 +9799,19 @@ "description": "Set HUBSPOT_ACCESS_TOKEN environment variable in the container", "is_required": true, "format": "string", - "value": "-e HUBSPOT_ACCESS_TOKEN=your_token", - "default": "-e HUBSPOT_ACCESS_TOKEN=your_token", + "value": "HUBSPOT_ACCESS_TOKEN=your_token", + "default": "HUBSPOT_ACCESS_TOKEN=your_token", "type": "named", - "name": "-e HUBSPOT_ACCESS_TOKEN=your_token", + "name": "-e", "value_hint": "HUBSPOT_ACCESS_TOKEN=your_token" }, { "description": "Optional persistent storage for state files", "format": "string", - "value": "-v /path/to/storage:/storage", - "default": "-v /path/to/storage:/storage", + "value": "/path/to/storage:/storage", + "default": "/path/to/storage:/storage", "type": "named", - "name": "-v /path/to/storage:/storage", + "name": "-v", "value_hint": "/path/to/storage:/storage" }, { @@ -9859,20 +9859,20 @@ "description": "--work-dir=~/mcp-files/ or x:/temp/mcp-files/", "is_required": true, "format": "string", - "value": "--work-dir=~/mcp-files/ or x:/temp/mcp-files/", - "default": "--work-dir=~/mcp-files/ or x:/temp/mcp-files/", + "value": "~/mcp-files/ or x:/temp/mcp-files/", + "default": "~/mcp-files/ or x:/temp/mcp-files/", "type": "named", - "name": "--work-dir=~/mcp-files/ or x:/temp/mcp-files/", + "name": "--work-dir", "value_hint": "~/mcp-files/ or x:/temp/mcp-files/" }, { "description": "--HF_TOKEN=HF_{optional token}", "is_required": true, "format": "string", - "value": "--HF_TOKEN=HF_{optional token}", - "default": "--HF_TOKEN=HF_{optional token}", + "value": "HF_{optional token}", + "default": "HF_{optional token}", "type": "named", - "name": "--HF_TOKEN=HF_{optional token}", + "name": "--HF_TOKEN", "value_hint": "HF_{optional token}" }, { @@ -9968,20 +9968,20 @@ "description": "--with mcp[cli]", "is_required": true, "format": "string", - "value": "--with mcp[cli]", - "default": "--with mcp[cli]", + "value": "mcp[cli]", + "default": "mcp[cli]", "type": "named", - "name": "--with mcp[cli]", + "name": "--with", "value_hint": "mcp[cli]" }, { "description": "--with subprocess", "is_required": true, "format": "string", - "value": "--with subprocess", - "default": "--with subprocess", + "value": "subprocess", + "default": "subprocess", "type": "named", - "name": "--with subprocess", + "name": "--with", "value_hint": "subprocess" }, { @@ -10048,10 +10048,10 @@ "description": "--from git+https://github.com/iflytek/ifly-workflow-mcp-server", "is_required": true, "format": "string", - "value": "--from git+https://github.com/iflytek/ifly-workflow-mcp-server", - "default": "--from git+https://github.com/iflytek/ifly-workflow-mcp-server", + "value": "git+https://github.com/iflytek/ifly-workflow-mcp-server", + "default": "git+https://github.com/iflytek/ifly-workflow-mcp-server", "type": "named", - "name": "--from git+https://github.com/iflytek/ifly-workflow-mcp-server", + "name": "--from", "value_hint": "git+https://github.com/iflytek/ifly-workflow-mcp-server" }, { @@ -10551,8 +10551,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -10560,8 +10560,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -10569,20 +10569,20 @@ "description": "-e KIBELA_TEAM", "is_required": true, "format": "string", - "value": "-e KIBELA_TEAM", - "default": "-e KIBELA_TEAM", + "value": "KIBELA_TEAM", + "default": "KIBELA_TEAM", "type": "named", - "name": "-e KIBELA_TEAM", + "name": "-e", "value_hint": "KIBELA_TEAM" }, { "description": "-e KIBELA_TOKEN", "is_required": true, "format": "string", - "value": "-e KIBELA_TOKEN", - "default": "-e KIBELA_TOKEN", + "value": "KIBELA_TOKEN", + "default": "KIBELA_TOKEN", "type": "named", - "name": "-e KIBELA_TOKEN", + "name": "-e", "value_hint": "KIBELA_TOKEN" }, { @@ -10815,8 +10815,8 @@ "description": "debug", "is_required": true, "format": "string", - "value": "debug", - "default": "debug", + "value": "", + "default": "", "type": "named", "name": "debug", "value_hint": "debug" @@ -10929,40 +10929,40 @@ "description": "Index to be used (first occurrence)", "is_required": true, "format": "string", - "value": "--index 10k-SEC-Tesla", - "default": "--index 10k-SEC-Tesla", + "value": "10k-SEC-Tesla", + "default": "10k-SEC-Tesla", "type": "named", - "name": "--index 10k-SEC-Tesla", + "name": "--index", "value_hint": "10k-SEC-Tesla" }, { "description": "Description for index (first occurrence)", "is_required": true, "format": "string", - "value": "--description 10k SEC documents from 2023 for Tesla", - "default": "--description 10k SEC documents from 2023 for Tesla", + "value": "10k SEC documents from 2023 for Tesla", + "default": "10k SEC documents from 2023 for Tesla", "type": "named", - "name": "--description 10k SEC documents from 2023 for Tesla", + "name": "--description", "value_hint": "10k SEC documents from 2023 for Tesla" }, { "description": "Index to be used (second occurrence)", "is_required": true, "format": "string", - "value": "--index 10k-SEC-Apple", - "default": "--index 10k-SEC-Apple", + "value": "10k-SEC-Apple", + "default": "10k-SEC-Apple", "type": "named", - "name": "--index 10k-SEC-Apple", + "name": "--index", "value_hint": "10k-SEC-Apple" }, { "description": "Description for index (second occurrence)", "is_required": true, "format": "string", - "value": "--description 10k SEC documents from 2023 for Apple", - "default": "--description 10k SEC documents from 2023 for Apple", + "value": "10k SEC documents from 2023 for Apple", + "default": "10k SEC documents from 2023 for Apple", "type": "named", - "name": "--description 10k SEC documents from 2023 for Apple", + "name": "--description", "value_hint": "10k SEC documents from 2023 for Apple" } ], @@ -11011,10 +11011,10 @@ "description": "Named argument --from with value llm-context", "is_required": true, "format": "string", - "value": "--from llm-context", - "default": "--from llm-context", + "value": "llm-context", + "default": "llm-context", "type": "named", - "name": "--from llm-context", + "name": "--from", "value_hint": "llm-context" } ], @@ -11083,10 +11083,10 @@ "description": "--directory /YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", "is_required": true, "format": "string", - "value": "--directory /YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", - "default": "--directory /YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", + "value": "/YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", + "default": "/YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", "type": "named", - "name": "--directory /YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb", + "name": "--directory", "value_hint": "/YOUR/SOURCE/PATH/mcp-server-mariadb/src/mcp_server_mariadb" }, { @@ -11246,18 +11246,18 @@ "description": "Mounts ~/.kube/config into container", "is_required": true, "format": "string", - "value": "-v ~/.kube/config:/home/nonroot/.kube/config", - "default": "-v ~/.kube/config:/home/nonroot/.kube/config", + "value": "~/.kube/config:/home/nonroot/.kube/config", + "default": "~/.kube/config:/home/nonroot/.kube/config", "type": "named", - "name": "-v ~/.kube/config:/home/nonroot/.kube/config", + "name": "-v", "value_hint": "~/.kube/config:/home/nonroot/.kube/config" }, { "description": "Removes container after exit", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -11306,10 +11306,10 @@ "description": "A named argument for directory.", "is_required": true, "format": "string", - "value": "--directory \u003cpath where this folder is located\u003e/mcp-local-rag/", - "default": "--directory \u003cpath where this folder is located\u003e/mcp-local-rag/", + "value": "\u003cpath where this folder is located\u003e/mcp-local-rag/", + "default": "\u003cpath where this folder is located\u003e/mcp-local-rag/", "type": "named", - "name": "--directory \u003cpath where this folder is located\u003e/mcp-local-rag/", + "name": "--directory", "value_hint": "\u003cpath where this folder is located\u003e/mcp-local-rag/" }, { @@ -11489,10 +11489,10 @@ "description": "Specifies the directory to use", "is_required": true, "format": "string", - "value": "--directory path/to/membase-mcp", - "default": "--directory path/to/membase-mcp", + "value": "path/to/membase-mcp", + "default": "path/to/membase-mcp", "type": "named", - "name": "--directory path/to/membase-mcp", + "name": "--directory", "value_hint": "path/to/membase-mcp" }, { @@ -11554,30 +11554,30 @@ "description": "\u003cYOUR_MT5_LOGIN\u003e", "is_required": true, "format": "string", - "value": "--login \u003cYOUR_MT5_LOGIN\u003e", - "default": "--login \u003cYOUR_MT5_LOGIN\u003e", + "value": "\u003cYOUR_MT5_LOGIN\u003e", + "default": "\u003cYOUR_MT5_LOGIN\u003e", "type": "named", - "name": "--login \u003cYOUR_MT5_LOGIN\u003e", + "name": "--login", "value_hint": "\u003cYOUR_MT5_LOGIN\u003e" }, { "description": "\u003cYOUR_MT5_PASSWORD\u003e", "is_required": true, "format": "string", - "value": "--password \u003cYOUR_MT5_PASSWORD\u003e", - "default": "--password \u003cYOUR_MT5_PASSWORD\u003e", + "value": "\u003cYOUR_MT5_PASSWORD\u003e", + "default": "\u003cYOUR_MT5_PASSWORD\u003e", "type": "named", - "name": "--password \u003cYOUR_MT5_PASSWORD\u003e", + "name": "--password", "value_hint": "\u003cYOUR_MT5_PASSWORD\u003e" }, { "description": "\u003cYOUR_MT5_SERVER\u003e", "is_required": true, "format": "string", - "value": "--server \u003cYOUR_MT5_SERVER\u003e", - "default": "--server \u003cYOUR_MT5_SERVER\u003e", + "value": "\u003cYOUR_MT5_SERVER\u003e", + "default": "\u003cYOUR_MT5_SERVER\u003e", "type": "named", - "name": "--server \u003cYOUR_MT5_SERVER\u003e", + "name": "--server", "value_hint": "\u003cYOUR_MT5_SERVER\u003e" } ], @@ -11656,10 +11656,10 @@ "description": "Directory path for the MCP server", "is_required": true, "format": "string", - "value": "--directory path/to/mssql_mcp_server", - "default": "--directory path/to/mssql_mcp_server", + "value": "path/to/mssql_mcp_server", + "default": "path/to/mssql_mcp_server", "type": "named", - "name": "--directory path/to/mssql_mcp_server", + "name": "--directory", "value_hint": "path/to/mssql_mcp_server" }, { @@ -11795,40 +11795,40 @@ "description": "Host to connect to", "is_required": true, "format": "string", - "value": "--host \u003cHOST\u003e", - "default": "--host \u003cHOST\u003e", + "value": "\u003cHOST\u003e", + "default": "\u003cHOST\u003e", "type": "named", - "name": "--host \u003cHOST\u003e", + "name": "--host", "value_hint": "\u003cHOST\u003e" }, { "description": "Username for authentication", "is_required": true, "format": "string", - "value": "--username \u003cUSERNAME\u003e", - "default": "--username \u003cUSERNAME\u003e", + "value": "\u003cUSERNAME\u003e", + "default": "\u003cUSERNAME\u003e", "type": "named", - "name": "--username \u003cUSERNAME\u003e", + "name": "--username", "value_hint": "\u003cUSERNAME\u003e" }, { "description": "Password for authentication", "is_required": true, "format": "string", - "value": "--password \u003cPASSWORD\u003e", - "default": "--password \u003cPASSWORD\u003e", + "value": "\u003cPASSWORD\u003e", + "default": "\u003cPASSWORD\u003e", "type": "named", - "name": "--password \u003cPASSWORD\u003e", + "name": "--password", "value_hint": "\u003cPASSWORD\u003e" }, { "description": "Port to connect to", "is_required": true, "format": "string", - "value": "--port 22", - "default": "--port 22", + "value": "22", + "default": "22", "type": "named", - "name": "--port 22", + "name": "--port", "value_hint": "22" } ], @@ -11867,8 +11867,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -11876,10 +11876,10 @@ "description": "-v /path/to/output/folder:/output", "is_required": true, "format": "string", - "value": "-v /path/to/output/folder:/output", - "default": "-v /path/to/output/folder:/output", + "value": "/path/to/output/folder:/output", + "default": "/path/to/output/folder:/output", "type": "named", - "name": "-v /path/to/output/folder:/output", + "name": "-v", "value_hint": "/path/to/output/folder:/output" } ], @@ -12172,10 +12172,10 @@ "description": "Specify the origin of the package", "is_required": true, "format": "string", - "value": "--from mysql-mcp-server", - "default": "--from mysql-mcp-server", + "value": "mysql-mcp-server", + "default": "mysql-mcp-server", "type": "named", - "name": "--from mysql-mcp-server", + "name": "--from", "value_hint": "mysql-mcp-server" }, { @@ -12296,8 +12296,8 @@ "description": "Comma-separated list", "is_required": true, "format": "string", - "value": "T2M,PRECTOTCORR,WS10M", - "default": "T2M,PRECTOTCORR,WS10M", + "value": "", + "default": "", "type": "named", "name": "T2M,PRECTOTCORR,WS10M", "value_hint": "T2M,PRECTOTCORR,WS10M" @@ -12306,8 +12306,8 @@ "description": "Community identifier", "is_required": true, "format": "string", - "value": "re", - "default": "re", + "value": "", + "default": "", "type": "named", "name": "re", "value_hint": "re" @@ -12316,8 +12316,8 @@ "description": "Latitude", "is_required": true, "format": "string", - "value": "40.7128", - "default": "40.7128", + "value": "", + "default": "", "type": "named", "name": "40.7128", "value_hint": "40.7128" @@ -12326,8 +12326,8 @@ "description": "Longitude", "is_required": true, "format": "string", - "value": "-74.0060", - "default": "-74.0060", + "value": "", + "default": "", "type": "named", "name": "-74.0060", "value_hint": "-74.0060" @@ -12336,8 +12336,8 @@ "description": "Start date (YYYYMMDD)", "is_required": true, "format": "string", - "value": "20220101", - "default": "20220101", + "value": "", + "default": "", "type": "named", "name": "20220101", "value_hint": "20220101" @@ -12346,8 +12346,8 @@ "description": "End date (YYYYMMDD)", "is_required": true, "format": "string", - "value": "20220107", - "default": "20220107", + "value": "", + "default": "", "type": "named", "name": "20220107", "value_hint": "20220107" @@ -12388,10 +12388,10 @@ "description": "investment_company_type argument", "is_required": true, "format": "string", - "value": "investment_company_type N-1A", - "default": "investment_company_type N-1A", + "value": "", + "default": "", "type": "named", - "name": "investment_company_type N-1A", + "name": "investment_company_type", "value_hint": "N-1A" } ], @@ -12657,8 +12657,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -12666,8 +12666,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -12675,20 +12675,20 @@ "description": "-e NOMAD_ADDR=http://172.17.0.1:4646", "is_required": true, "format": "string", - "value": "-e NOMAD_ADDR=http://172.17.0.1:4646", - "default": "-e NOMAD_ADDR=http://172.17.0.1:4646", + "value": "NOMAD_ADDR=http://172.17.0.1:4646", + "default": "NOMAD_ADDR=http://172.17.0.1:4646", "type": "named", - "name": "-e NOMAD_ADDR=http://172.17.0.1:4646", + "name": "-e", "value_hint": "NOMAD_ADDR=http://172.17.0.1:4646" }, { "description": "-e NOMAD_TOKEN=secret-token-acl-optional", "is_required": true, "format": "string", - "value": "-e NOMAD_TOKEN=secret-token-acl-optional", - "default": "-e NOMAD_TOKEN=secret-token-acl-optional", + "value": "NOMAD_TOKEN=secret-token-acl-optional", + "default": "NOMAD_TOKEN=secret-token-acl-optional", "type": "named", - "name": "-e NOMAD_TOKEN=secret-token-acl-optional", + "name": "-e", "value_hint": "NOMAD_TOKEN=secret-token-acl-optional" }, { @@ -13059,10 +13059,10 @@ "description": "Named argument --from with value office-powerpoint-mcp-server", "is_required": true, "format": "string", - "value": "--from office-powerpoint-mcp-server", - "default": "--from office-powerpoint-mcp-server", + "value": "office-powerpoint-mcp-server", + "default": "office-powerpoint-mcp-server", "type": "named", - "name": "--from office-powerpoint-mcp-server", + "name": "--from", "value_hint": "office-powerpoint-mcp-server" }, { @@ -13190,10 +13190,10 @@ "description": "Run Python module openai_websearch_mcp", "is_required": true, "format": "string", - "value": "-m openai_websearch_mcp", - "default": "-m openai_websearch_mcp", + "value": "openai_websearch_mcp", + "default": "openai_websearch_mcp", "type": "named", - "name": "-m openai_websearch_mcp", + "name": "-m", "value_hint": "openai_websearch_mcp" } ], @@ -13268,8 +13268,8 @@ "description": "Run in interactive mode", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -13277,8 +13277,8 @@ "description": "Automatically remove the container when it exits", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -13286,30 +13286,30 @@ "description": "Set environment variable OPENAPI_JSON_DOCS_URL", "is_required": true, "format": "string", - "value": "-e OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json", - "default": "-e OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json", + "value": "OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json", + "default": "OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json", "type": "named", - "name": "-e OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json", + "name": "-e", "value_hint": "OPENAPI_JSON_DOCS_URL=https://api.example.com/openapi.json" }, { "description": "Set environment variable MCP_API_PREFIX", "is_required": true, "format": "string", - "value": "-e MCP_API_PREFIX=finance", - "default": "-e MCP_API_PREFIX=finance", + "value": "MCP_API_PREFIX=finance", + "default": "MCP_API_PREFIX=finance", "type": "named", - "name": "-e MCP_API_PREFIX=finance", + "name": "-e", "value_hint": "MCP_API_PREFIX=finance" }, { "description": "Set environment variable GLOBAL_TOOL_PROMPT", "is_required": true, "format": "string", - "value": "-e GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .", - "default": "-e GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .", + "value": "GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .", + "default": "GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .", "type": "named", - "name": "-e GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com .", + "name": "-e", "value_hint": "GLOBAL_TOOL_PROMPT='Access to insights apis for ACME Financial Services abc.com ." }, { @@ -13458,8 +13458,8 @@ "description": "-c", "is_required": true, "format": "string", - "value": "-c", - "default": "-c", + "value": "", + "default": "", "type": "named", "name": "-c", "value_hint": "-c" @@ -13539,10 +13539,10 @@ "description": "Specifies the source repository", "is_required": true, "format": "string", - "value": "--from git+https://github.com/open-strategy-partners/osp_marketing_tools@main", - "default": "--from git+https://github.com/open-strategy-partners/osp_marketing_tools@main", + "value": "git+https://github.com/open-strategy-partners/osp_marketing_tools@main", + "default": "git+https://github.com/open-strategy-partners/osp_marketing_tools@main", "type": "named", - "name": "--from git+https://github.com/open-strategy-partners/osp_marketing_tools@main", + "name": "--from", "value_hint": "git+https://github.com/open-strategy-partners/osp_marketing_tools@main" } ], @@ -13611,10 +13611,10 @@ "description": "Specify directory to run from", "is_required": true, "format": "string", - "value": "--directory path/to/pancakeswap-poolspy-mcp", - "default": "--directory path/to/pancakeswap-poolspy-mcp", + "value": "path/to/pancakeswap-poolspy-mcp", + "default": "path/to/pancakeswap-poolspy-mcp", "type": "named", - "name": "--directory path/to/pancakeswap-poolspy-mcp", + "name": "--directory", "value_hint": "path/to/pancakeswap-poolspy-mcp" }, { @@ -13698,10 +13698,10 @@ "description": "--from mcpdoc", "is_required": true, "format": "string", - "value": "--from mcpdoc", - "default": "--from mcpdoc", + "value": "mcpdoc", + "default": "mcpdoc", "type": "named", - "name": "--from mcpdoc", + "name": "--from", "value_hint": "mcpdoc" }, { @@ -13717,20 +13717,20 @@ "description": "--urls Paradex:https://docs.paradex.trade/llms.txt", "is_required": true, "format": "string", - "value": "--urls Paradex:https://docs.paradex.trade/llms.txt", - "default": "--urls Paradex:https://docs.paradex.trade/llms.txt", + "value": "Paradex:https://docs.paradex.trade/llms.txt", + "default": "Paradex:https://docs.paradex.trade/llms.txt", "type": "named", - "name": "--urls Paradex:https://docs.paradex.trade/llms.txt", + "name": "--urls", "value_hint": "Paradex:https://docs.paradex.trade/llms.txt" }, { "description": "--transport stdio", "is_required": true, "format": "string", - "value": "--transport stdio", - "default": "--transport stdio", + "value": "stdio", + "default": "stdio", "type": "named", - "name": "--transport stdio", + "name": "--transport", "value_hint": "stdio" } ], @@ -13799,20 +13799,20 @@ "description": "Index name for the Pinecone database.", "is_required": true, "format": "string", - "value": "--index-name {your-index-name}", - "default": "--index-name {your-index-name}", + "value": "{your-index-name}", + "default": "{your-index-name}", "type": "named", - "name": "--index-name {your-index-name}", + "name": "--index-name", "value_hint": "{your-index-name}" }, { "description": "API key for authenticating with Pinecone.", "is_required": true, "format": "string", - "value": "--api-key {your-secret-api-key}", - "default": "--api-key {your-secret-api-key}", + "value": "{your-secret-api-key}", + "default": "{your-secret-api-key}", "type": "named", - "name": "--api-key {your-secret-api-key}", + "name": "--api-key", "value_hint": "{your-secret-api-key}" } ], @@ -14037,8 +14037,8 @@ "description": "Automatically remove the container when it exits.", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -14047,8 +14047,8 @@ "description": "Keep STDIN open even if not attached.", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -14057,30 +14057,30 @@ "description": "Set environment variable PROMETHEUS_URL inside the container.", "is_required": true, "format": "string", - "value": "-e PROMETHEUS_URL", - "default": "-e PROMETHEUS_URL", + "value": "PROMETHEUS_URL", + "default": "PROMETHEUS_URL", "type": "named", - "name": "-e PROMETHEUS_URL", + "name": "-e", "value_hint": "PROMETHEUS_URL" }, { "description": "Set environment variable PROMETHEUS_USERNAME inside the container.", "is_required": true, "format": "string", - "value": "-e PROMETHEUS_USERNAME", - "default": "-e PROMETHEUS_USERNAME", + "value": "PROMETHEUS_USERNAME", + "default": "PROMETHEUS_USERNAME", "type": "named", - "name": "-e PROMETHEUS_USERNAME", + "name": "-e", "value_hint": "PROMETHEUS_USERNAME" }, { "description": "Set environment variable PROMETHEUS_PASSWORD inside the container.", "is_required": true, "format": "string", - "value": "-e PROMETHEUS_PASSWORD", - "default": "-e PROMETHEUS_PASSWORD", + "value": "PROMETHEUS_PASSWORD", + "default": "PROMETHEUS_PASSWORD", "type": "named", - "name": "-e PROMETHEUS_PASSWORD", + "name": "-e", "value_hint": "PROMETHEUS_PASSWORD" } ], @@ -14163,8 +14163,8 @@ "description": "-i", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -14173,8 +14173,8 @@ "description": "--rm", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -14183,20 +14183,20 @@ "description": "--name pulumi-mcp-server", "is_required": true, "format": "string", - "value": "--name pulumi-mcp-server", - "default": "--name pulumi-mcp-server", + "value": "pulumi-mcp-server", + "default": "pulumi-mcp-server", "type": "named", - "name": "--name pulumi-mcp-server", + "name": "--name", "value_hint": "pulumi-mcp-server" }, { "description": "-e PULUMI_ACCESS_TOKEN", "is_required": true, "format": "string", - "value": "-e PULUMI_ACCESS_TOKEN", - "default": "-e PULUMI_ACCESS_TOKEN", + "value": "PULUMI_ACCESS_TOKEN", + "default": "PULUMI_ACCESS_TOKEN", "type": "named", - "name": "-e PULUMI_ACCESS_TOKEN", + "name": "-e", "value_hint": "PULUMI_ACCESS_TOKEN" }, { @@ -14289,20 +14289,20 @@ "description": "--token YOUR_TOKEN", "is_required": true, "format": "string", - "value": "--token YOUR_TOKEN", - "default": "--token YOUR_TOKEN", + "value": "YOUR_TOKEN", + "default": "YOUR_TOKEN", "type": "named", - "name": "--token YOUR_TOKEN", + "name": "--token", "value_hint": "YOUR_TOKEN" }, { "description": "--user YOUR_USER", "is_required": true, "format": "string", - "value": "--user YOUR_USER", - "default": "--user YOUR_USER", + "value": "YOUR_USER", + "default": "YOUR_USER", "type": "named", - "name": "--user YOUR_USER", + "name": "--user", "value_hint": "YOUR_USER" } ], @@ -14341,10 +14341,10 @@ "description": "Specifies the directory to run the command from", "is_required": true, "format": "string", - "value": "--directory /ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp", - "default": "--directory /ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp", + "value": "/ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp", + "default": "/ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp", "type": "named", - "name": "--directory /ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp", + "name": "--directory", "value_hint": "/ABSOLUTE/PATH/TO/PARENT/REPO/FOLDER/qgis_mcp/src/qgis_mcp" }, { @@ -14458,10 +14458,10 @@ "description": "Specify directory to run the package from", "is_required": true, "format": "string", - "value": "--directory /path/to/repo/mcp-server-rabbitmq", - "default": "--directory /path/to/repo/mcp-server-rabbitmq", + "value": "/path/to/repo/mcp-server-rabbitmq", + "default": "/path/to/repo/mcp-server-rabbitmq", "type": "named", - "name": "--directory /path/to/repo/mcp-server-rabbitmq", + "name": "--directory", "value_hint": "/path/to/repo/mcp-server-rabbitmq" }, { @@ -14477,50 +14477,50 @@ "description": "RabbitMQ host name", "is_required": true, "format": "string", - "value": "--rabbitmq-host \u003chostname ex. test.rabbit.com, localhost\u003e", - "default": "--rabbitmq-host \u003chostname ex. test.rabbit.com, localhost\u003e", + "value": "\u003chostname ex. test.rabbit.com, localhost\u003e", + "default": "\u003chostname ex. test.rabbit.com, localhost\u003e", "type": "named", - "name": "--rabbitmq-host \u003chostname ex. test.rabbit.com, localhost\u003e", + "name": "--rabbitmq-host", "value_hint": "\u003chostname ex. test.rabbit.com, localhost\u003e" }, { "description": "RabbitMQ port number", "is_required": true, "format": "string", - "value": "--port \u003cport number ex. 5672\u003e", - "default": "--port \u003cport number ex. 5672\u003e", + "value": "\u003cport number ex. 5672\u003e", + "default": "\u003cport number ex. 5672\u003e", "type": "named", - "name": "--port \u003cport number ex. 5672\u003e", + "name": "--port", "value_hint": "\u003cport number ex. 5672\u003e" }, { "description": "RabbitMQ username", "is_required": true, "format": "string", - "value": "--username \u003crabbitmq username\u003e", - "default": "--username \u003crabbitmq username\u003e", + "value": "\u003crabbitmq username\u003e", + "default": "\u003crabbitmq username\u003e", "type": "named", - "name": "--username \u003crabbitmq username\u003e", + "name": "--username", "value_hint": "\u003crabbitmq username\u003e" }, { "description": "RabbitMQ password", "is_required": true, "format": "string", - "value": "--password \u003crabbitmq password\u003e", - "default": "--password \u003crabbitmq password\u003e", + "value": "\u003crabbitmq password\u003e", + "default": "\u003crabbitmq password\u003e", "type": "named", - "name": "--password \u003crabbitmq password\u003e", + "name": "--password", "value_hint": "\u003crabbitmq password\u003e" }, { "description": "Whether to use TLS (amqps protocol)", "is_required": true, "format": "string", - "value": "--use-tls \u003ctrue if uses amqps, false otherwise\u003e", - "default": "--use-tls \u003ctrue if uses amqps, false otherwise\u003e", + "value": "\u003ctrue if uses amqps, false otherwise\u003e", + "default": "\u003ctrue if uses amqps, false otherwise\u003e", "type": "named", - "name": "--use-tls \u003ctrue if uses amqps, false otherwise\u003e", + "name": "--use-tls", "value_hint": "\u003ctrue if uses amqps, false otherwise\u003e" } ], @@ -15004,8 +15004,8 @@ "description": "Run an image", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -15014,8 +15014,8 @@ "description": "Remove container after run", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -15024,10 +15024,10 @@ "description": "Set environment variable in container", "is_required": true, "format": "string", - "value": "-e SEARXNG_URL", - "default": "-e SEARXNG_URL", + "value": "SEARXNG_URL", + "default": "SEARXNG_URL", "type": "named", - "name": "-e SEARXNG_URL", + "name": "-e", "value_hint": "SEARXNG_URL" } ], @@ -15161,20 +15161,20 @@ "description": "--accessToken \u003cYOUR_ACCESS_TOKEN\u003e", "is_required": true, "format": "string", - "value": "--accessToken \u003cYOUR_ACCESS_TOKEN\u003e", - "default": "--accessToken \u003cYOUR_ACCESS_TOKEN\u003e", + "value": "\u003cYOUR_ACCESS_TOKEN\u003e", + "default": "\u003cYOUR_ACCESS_TOKEN\u003e", "type": "named", - "name": "--accessToken \u003cYOUR_ACCESS_TOKEN\u003e", + "name": "--accessToken", "value_hint": "\u003cYOUR_ACCESS_TOKEN\u003e" }, { "description": "--domain \u003cYOUR_SHOP\u003e.myshopify.com", "is_required": true, "format": "string", - "value": "--domain \u003cYOUR_SHOP\u003e.myshopify.com", - "default": "--domain \u003cYOUR_SHOP\u003e.myshopify.com", + "value": "\u003cYOUR_SHOP\u003e.myshopify.com", + "default": "\u003cYOUR_SHOP\u003e.myshopify.com", "type": "named", - "name": "--domain \u003cYOUR_SHOP\u003e.myshopify.com", + "name": "--domain", "value_hint": "\u003cYOUR_SHOP\u003e.myshopify.com" } ], @@ -15243,20 +15243,20 @@ "description": "--python=3.12", "is_required": true, "format": "string", - "value": "--python=3.12", - "default": "--python=3.12", + "value": "3.12", + "default": "3.12", "type": "named", - "name": "--python=3.12", + "name": "--python", "value_hint": "3.12" }, { "description": "--directory /absolute/path/to/mcp_snowflake_server", "is_required": true, "format": "string", - "value": "--directory /absolute/path/to/mcp_snowflake_server", - "default": "--directory /absolute/path/to/mcp_snowflake_server", + "value": "/absolute/path/to/mcp_snowflake_server", + "default": "/absolute/path/to/mcp_snowflake_server", "type": "named", - "name": "--directory /absolute/path/to/mcp_snowflake_server", + "name": "--directory", "value_hint": "/absolute/path/to/mcp_snowflake_server" }, { @@ -15394,10 +15394,10 @@ "description": "Set the working directory", "is_required": true, "format": "string", - "value": "--directory /path/to/spotify_mcp", - "default": "--directory /path/to/spotify_mcp", + "value": "/path/to/spotify_mcp", + "default": "/path/to/spotify_mcp", "type": "named", - "name": "--directory /path/to/spotify_mcp", + "name": "--directory", "value_hint": "/path/to/spotify_mcp" }, { @@ -15489,10 +15489,10 @@ "description": "charge_id argument", "is_required": true, "format": "string", - "value": "charge_id ch_abc123", - "default": "charge_id ch_abc123", + "value": "", + "default": "", "type": "named", - "name": "charge_id ch_abc123", + "name": "charge_id", "value_hint": "ch_abc123" } ], @@ -15531,10 +15531,10 @@ "description": "Use with optional extra dependencies", "is_required": true, "format": "string", - "value": "--with mcp[cli]", - "default": "--with mcp[cli]", + "value": "mcp[cli]", + "default": "mcp[cli]", "type": "named", - "name": "--with mcp[cli]", + "name": "--with", "value_hint": "mcp[cli]" }, { @@ -15663,10 +15663,10 @@ "description": "Python module execution: -m mcp_server_tavily", "is_required": true, "format": "string", - "value": "-m mcp_server_tavily", - "default": "-m mcp_server_tavily", + "value": "mcp_server_tavily", + "default": "mcp_server_tavily", "type": "named", - "name": "-m mcp_server_tavily", + "name": "-m", "value_hint": "mcp_server_tavily" } ], @@ -15741,10 +15741,10 @@ "description": "Positional module argument to run the module terminal_controller with python", "is_required": true, "format": "string", - "value": "-m terminal_controller", - "default": "-m terminal_controller", + "value": "terminal_controller", + "default": "terminal_controller", "type": "named", - "name": "-m terminal_controller", + "name": "-m", "value_hint": "terminal_controller" } ], @@ -15783,30 +15783,30 @@ "description": "\u003cYOUR_RIOT_API_KEY\u003e", "is_required": true, "format": "string", - "value": "--apiKey \u003cYOUR_RIOT_API_KEY\u003e", - "default": "--apiKey \u003cYOUR_RIOT_API_KEY\u003e", + "value": "\u003cYOUR_RIOT_API_KEY\u003e", + "default": "\u003cYOUR_RIOT_API_KEY\u003e", "type": "named", - "name": "--apiKey \u003cYOUR_RIOT_API_KEY\u003e", + "name": "--apiKey", "value_hint": "\u003cYOUR_RIOT_API_KEY\u003e" }, { "description": "\u003cYOUR_GAME_NAME\u003e", "is_required": true, "format": "string", - "value": "--gameName \u003cYOUR_GAME_NAME\u003e", - "default": "--gameName \u003cYOUR_GAME_NAME\u003e", + "value": "\u003cYOUR_GAME_NAME\u003e", + "default": "\u003cYOUR_GAME_NAME\u003e", "type": "named", - "name": "--gameName \u003cYOUR_GAME_NAME\u003e", + "name": "--gameName", "value_hint": "\u003cYOUR_GAME_NAME\u003e" }, { "description": "\u003cYOUR_TAG_LINE\u003e", "is_required": true, "format": "string", - "value": "--tagLine \u003cYOUR_TAG_LINE\u003e", - "default": "--tagLine \u003cYOUR_TAG_LINE\u003e", + "value": "\u003cYOUR_TAG_LINE\u003e", + "default": "\u003cYOUR_TAG_LINE\u003e", "type": "named", - "name": "--tagLine \u003cYOUR_TAG_LINE\u003e", + "name": "--tagLine", "value_hint": "\u003cYOUR_TAG_LINE\u003e" } ], @@ -15845,10 +15845,10 @@ "description": "Specifies the directory to run the application from", "is_required": true, "format": "string", - "value": "--directory path/to/thegraph-mcp", - "default": "--directory path/to/thegraph-mcp", + "value": "path/to/thegraph-mcp", + "default": "path/to/thegraph-mcp", "type": "named", - "name": "--directory path/to/thegraph-mcp", + "name": "--directory", "value_hint": "path/to/thegraph-mcp" }, { @@ -15938,8 +15938,8 @@ "description": "Run container in interactive mode", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i", "value_hint": "-i" @@ -15948,8 +15948,8 @@ "description": "Automatically remove the container when it exits", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm", "value_hint": "--rm" @@ -15958,30 +15958,30 @@ "description": "Set the TICKTICK_CLIENT_ID environment variable in the container", "is_required": true, "format": "string", - "value": "-e TICKTICK_CLIENT_ID", - "default": "-e TICKTICK_CLIENT_ID", + "value": "TICKTICK_CLIENT_ID", + "default": "TICKTICK_CLIENT_ID", "type": "named", - "name": "-e TICKTICK_CLIENT_ID", + "name": "-e", "value_hint": "TICKTICK_CLIENT_ID" }, { "description": "Set the TICKTICK_CLIENT_SECRET environment variable in the container", "is_required": true, "format": "string", - "value": "-e TICKTICK_CLIENT_SECRET", - "default": "-e TICKTICK_CLIENT_SECRET", + "value": "TICKTICK_CLIENT_SECRET", + "default": "TICKTICK_CLIENT_SECRET", "type": "named", - "name": "-e TICKTICK_CLIENT_SECRET", + "name": "-e", "value_hint": "TICKTICK_CLIENT_SECRET" }, { "description": "Set the TICKTICK_ACCESS_TOKEN environment variable in the container", "is_required": true, "format": "string", - "value": "-e TICKTICK_ACCESS_TOKEN", - "default": "-e TICKTICK_ACCESS_TOKEN", + "value": "TICKTICK_ACCESS_TOKEN", + "default": "TICKTICK_ACCESS_TOKEN", "type": "named", - "name": "-e TICKTICK_ACCESS_TOKEN", + "name": "-e", "value_hint": "TICKTICK_ACCESS_TOKEN" }, { @@ -16170,40 +16170,40 @@ "description": "The Typesense server host", "is_required": true, "format": "string", - "value": "--host your-typesense-host", - "default": "--host your-typesense-host", + "value": "your-typesense-host", + "default": "your-typesense-host", "type": "named", - "name": "--host your-typesense-host", + "name": "--host", "value_hint": "your-typesense-host" }, { "description": "The Typesense server port", "is_required": true, "format": "string", - "value": "--port 8108", - "default": "--port 8108", + "value": "8108", + "default": "8108", "type": "named", - "name": "--port 8108", + "name": "--port", "value_hint": "8108" }, { "description": "The Typesense server protocol", "is_required": true, "format": "string", - "value": "--protocol http", - "default": "--protocol http", + "value": "http", + "default": "http", "type": "named", - "name": "--protocol http", + "name": "--protocol", "value_hint": "http" }, { "description": "The Typesense API key", "is_required": true, "format": "string", - "value": "--api-key your-api-key", - "default": "--api-key your-api-key", + "value": "your-api-key", + "default": "your-api-key", "type": "named", - "name": "--api-key your-api-key", + "name": "--api-key", "value_hint": "your-api-key" } ], @@ -16375,8 +16375,8 @@ "description": "Remove container after run", "is_required": true, "format": "string", - "value": "--rm", - "default": "--rm", + "value": "", + "default": "", "type": "named", "name": "--rm" }, @@ -16384,8 +16384,8 @@ "description": "Keep STDIN open even if not attached", "is_required": true, "format": "string", - "value": "-i", - "default": "-i", + "value": "", + "default": "", "type": "named", "name": "-i" }, @@ -16393,30 +16393,30 @@ "description": "Specify Unity Catalog server URL", "is_required": true, "format": "string", - "value": "--uc_server \u003cyour unity catalog url\u003e", - "default": "--uc_server \u003cyour unity catalog url\u003e", + "value": "\u003cyour unity catalog url\u003e", + "default": "\u003cyour unity catalog url\u003e", "type": "named", - "name": "--uc_server \u003cyour unity catalog url\u003e", + "name": "--uc_server", "value_hint": "\u003cyour unity catalog url\u003e" }, { "description": "Specify Unity Catalog name", "is_required": true, "format": "string", - "value": "--uc_catalog \u003cyour catalog name\u003e", - "default": "--uc_catalog \u003cyour catalog name\u003e", + "value": "\u003cyour catalog name\u003e", + "default": "\u003cyour catalog name\u003e", "type": "named", - "name": "--uc_catalog \u003cyour catalog name\u003e", + "name": "--uc_catalog", "value_hint": "\u003cyour catalog name\u003e" }, { "description": "Specify Unity Catalog schema name", "is_required": true, "format": "string", - "value": "--uc_schema \u003cyour schema name\u003e", - "default": "--uc_schema \u003cyour schema name\u003e", + "value": "\u003cyour schema name\u003e", + "default": "\u003cyour schema name\u003e", "type": "named", - "name": "--uc_schema \u003cyour schema name\u003e", + "name": "--uc_schema", "value_hint": "\u003cyour schema name\u003e" } ], @@ -16551,10 +16551,10 @@ "description": "Directory to use", "is_required": true, "format": "string", - "value": "--directory /Users/\u003cPATH_TO\u003e/video-jungle-mcp", - "default": "--directory /Users/\u003cPATH_TO\u003e/video-jungle-mcp", + "value": "/Users/\u003cPATH_TO\u003e/video-jungle-mcp", + "default": "/Users/\u003cPATH_TO\u003e/video-jungle-mcp", "type": "named", - "name": "--directory /Users/\u003cPATH_TO\u003e/video-jungle-mcp", + "name": "--directory", "value_hint": "/Users/\u003cPATH_TO\u003e/video-jungle-mcp" }, { @@ -16617,30 +16617,30 @@ "description": "Use extra requirements with package", "is_required": true, "format": "string", - "value": "--with mcp[cli]", - "default": "--with mcp[cli]", + "value": "mcp[cli]", + "default": "mcp[cli]", "type": "named", - "name": "--with mcp[cli]", + "name": "--with", "value_hint": "mcp[cli]" }, { "description": "Use extra requirements with package", "is_required": true, "format": "string", - "value": "--with numpy", - "default": "--with numpy", + "value": "numpy", + "default": "numpy", "type": "named", - "name": "--with numpy", + "name": "--with", "value_hint": "numpy" }, { "description": "Use extra requirements with package", "is_required": true, "format": "string", - "value": "--with opencv-python", - "default": "--with opencv-python", + "value": "opencv-python", + "default": "opencv-python", "type": "named", - "name": "--with opencv-python", + "name": "--with", "value_hint": "opencv-python" }, { @@ -17030,10 +17030,10 @@ "description": "The directory to use", "is_required": true, "format": "string", - "value": "--directory path/to/world_bank_mcp_server", - "default": "--directory path/to/world_bank_mcp_server", + "value": "path/to/world_bank_mcp_server", + "default": "path/to/world_bank_mcp_server", "type": "named", - "name": "--directory path/to/world_bank_mcp_server", + "name": "--directory", "value_hint": "path/to/world_bank_mcp_server" }, { diff --git a/internal/database/import.go b/internal/database/import.go index bcd378f..58a2ead 100644 --- a/internal/database/import.go +++ b/internal/database/import.go @@ -5,10 +5,12 @@ import ( "encoding/json" "fmt" "io" + "log" "net/http" "os" "strings" + "github.com/modelcontextprotocol/registry/internal/validators" apiv0 "github.com/modelcontextprotocol/registry/pkg/api/v0" ) @@ -48,14 +50,37 @@ func ReadSeedFile(ctx context.Context, path string) ([]*apiv0.ServerRecord, erro return []*apiv0.ServerRecord{}, nil } - // Convert ServerResponse to ServerRecord - var records []*apiv0.ServerRecord + // Validate servers and collect warnings instead of failing the whole batch + var validRecords []*apiv0.ServerRecord + var invalidServers []string + var validationFailures []string + for _, response := range serverResponses { + if err := validators.ValidateServerJSON(&response.Server); err != nil { + // Log warning and track invalid server instead of failing + invalidServers = append(invalidServers, response.Server.Name) + validationFailures = append(validationFailures, fmt.Sprintf("Server '%s': %v", response.Server.Name, err)) + log.Printf("Warning: Skipping invalid server '%s': %v", response.Server.Name, err) + continue + } + + // Convert valid ServerResponse to ServerRecord record := convertServerResponseToRecord(response) - records = append(records, record) + validRecords = append(validRecords, record) } - return records, nil + // Print summary of validation results + if len(invalidServers) > 0 { + log.Printf("Import summary: %d valid servers imported, %d invalid servers skipped", len(validRecords), len(invalidServers)) + log.Printf("Invalid servers: %v", invalidServers) + for _, failure := range validationFailures { + log.Printf(" - %s", failure) + } + } else { + log.Printf("Import summary: All %d servers imported successfully", len(validRecords)) + } + + return validRecords, nil } func fetchFromHTTP(ctx context.Context, url string) ([]byte, error) { diff --git a/internal/database/import_test.go b/internal/database/import_test.go index 8023d9e..cc4f58c 100644 --- a/internal/database/import_test.go +++ b/internal/database/import_test.go @@ -21,7 +21,7 @@ func TestReadSeedFile_LocalFile(t *testing.T) { seedData := []apiv0.ServerRecord{ { Server: model.ServerJSON{ - Name: "test-server-1", + Name: "com.example/test-server-1", Description: "Test server 1", Repository: model.Repository{ URL: "https://github.com/test/repo1", @@ -31,6 +31,11 @@ func TestReadSeedFile_LocalFile(t *testing.T) { VersionDetail: model.VersionDetail{ Version: "1.0.0", }, + Remotes: []model.Remote{ + { + URL: "https://example.com/remote", + }, + }, }, XIOModelContextProtocolRegistry: apiv0.RegistryExtensions{ ID: "test-id-1", @@ -61,7 +66,7 @@ func TestReadSeedFile_LocalFile(t *testing.T) { result, err := database.ReadSeedFile(context.Background(), tempFile) assert.NoError(t, err) assert.Len(t, result, 1) - assert.Equal(t, "test-server-1", result[0].Server.Name) + assert.Equal(t, "com.example/test-server-1", result[0].Server.Name) } func TestReadSeedFile_DirectHTTPURL(t *testing.T) { @@ -69,8 +74,13 @@ func TestReadSeedFile_DirectHTTPURL(t *testing.T) { seedData := []apiv0.ServerRecord{ { Server: model.ServerJSON{ - Name: "test-server-1", + Name: "com.example/test-server-1", Description: "Test server 1", + Remotes: []model.Remote{ + { + URL: "https://example.com/remote", + }, + }, }, XIOModelContextProtocolRegistry: apiv0.RegistryExtensions{ ID: "test-id-1", @@ -93,7 +103,7 @@ func TestReadSeedFile_DirectHTTPURL(t *testing.T) { result, err := database.ReadSeedFile(context.Background(), server.URL+"/seed.json") assert.NoError(t, err) assert.Len(t, result, 1) - assert.Equal(t, "test-server-1", result[0].Server.Name) + assert.Equal(t, "com.example/test-server-1", result[0].Server.Name) } func TestReadSeedFile_RegistryURL(t *testing.T) { diff --git a/internal/validators/constants.go b/internal/validators/constants.go index 145752e..37ce46e 100644 --- a/internal/validators/constants.go +++ b/internal/validators/constants.go @@ -12,6 +12,12 @@ var ( // Remote validation errors ErrInvalidRemoteURL = errors.New("invalid remote URL") + + // Argument validation errors + ErrNamedArgumentNameRequired = errors.New("named argument name is required") + ErrInvalidNamedArgumentName = errors.New("invalid named argument name format") + ErrArgumentValueStartsWithName = errors.New("argument value cannot start with the argument name") + ErrArgumentDefaultStartsWithName = errors.New("argument default cannot start with the argument name") ) // RepositorySource represents valid repository sources diff --git a/internal/validators/validators.go b/internal/validators/validators.go index 0fe74cd..219a159 100644 --- a/internal/validators/validators.go +++ b/internal/validators/validators.go @@ -71,6 +71,66 @@ func validatePackageField(obj *model.Package) error { return ErrPackageNameHasSpaces } + // Validate runtime arguments + for _, arg := range obj.RuntimeArguments { + if err := validateArgument(&arg); err != nil { + return fmt.Errorf("invalid runtime argument: %w", err) + } + } + + // Validate package arguments + for _, arg := range obj.PackageArguments { + if err := validateArgument(&arg); err != nil { + return fmt.Errorf("invalid package argument: %w", err) + } + } + + return nil +} + +// validateArgument validates argument details +func validateArgument(obj *model.Argument) error { + if obj.Type == model.ArgumentTypeNamed { + // Validate named argument name format + if err := validateNamedArgumentName(obj.Name); err != nil { + return err + } + + // Validate value and default don't start with the name + if err := validateArgumentValueFields(obj.Name, obj.Value, obj.Default); err != nil { + return err + } + } + return nil +} + +func validateNamedArgumentName(name string) error { + // Check if name is required for named arguments + if name == "" { + return ErrNamedArgumentNameRequired + } + + // Check for invalid characters that suggest embedded values or descriptions + // Valid: "--directory", "--port", "-v", "config", "verbose" + // Invalid: "--directory ", "--port 8080" + if strings.Contains(name, "<") || strings.Contains(name, ">") || + strings.Contains(name, " ") || strings.Contains(name, "$") { + return fmt.Errorf("%w: %s", ErrInvalidNamedArgumentName, name) + } + + return nil +} + +func validateArgumentValueFields(name, value, defaultValue string) error { + // Check if value starts with the argument name (using startsWith, not contains) + if value != "" && strings.HasPrefix(value, name) { + return fmt.Errorf("%w: value starts with argument name '%s': %s", ErrArgumentValueStartsWithName, name, value) + } + + if defaultValue != "" && strings.HasPrefix(defaultValue, name) { + return fmt.Errorf("%w: default starts with argument name '%s': %s", ErrArgumentDefaultStartsWithName, name, defaultValue) + } + return nil } diff --git a/internal/validators/validators_test.go b/internal/validators/validators_test.go index 568e8ae..d56e4dd 100644 --- a/internal/validators/validators_test.go +++ b/internal/validators/validators_test.go @@ -1,6 +1,7 @@ package validators_test import ( + "fmt" "testing" "github.com/modelcontextprotocol/registry/internal/validators" @@ -451,3 +452,225 @@ func TestValidate_ServerNameFormat(t *testing.T) { }) } } + +func TestValidateArgument_ValidNamedArguments(t *testing.T) { + validCases := []model.Argument{ + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "/path/to/dir"}}, + Type: model.ArgumentTypeNamed, + Name: "--directory", + }, + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Default: "8080"}}, + Type: model.ArgumentTypeNamed, + Name: "--port", + }, + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "true"}}, + Type: model.ArgumentTypeNamed, + Name: "-v", + }, + { + Type: model.ArgumentTypeNamed, + Name: "-p", + }, + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "/etc/config.json"}}, + Type: model.ArgumentTypeNamed, + Name: "config", + }, + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Default: "false"}}, + Type: model.ArgumentTypeNamed, + Name: "verbose", + }, + // No dash prefix requirement as per modification #1 + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "json"}}, + Type: model.ArgumentTypeNamed, + Name: "output-format", + }, + } + + for _, arg := range validCases { + t.Run("Valid_"+arg.Name, func(t *testing.T) { + server := createValidServerWithArgument(arg) + err := validators.ValidateServerJSON(&server) + assert.NoError(t, err, "Expected valid argument %+v", arg) + }) + } +} + +func TestValidateArgument_ValidPositionalArguments(t *testing.T) { + positionalCases := []model.Argument{ + {Type: model.ArgumentTypePositional, Name: "anything with spaces"}, + {Type: model.ArgumentTypePositional, Name: "anythingbrackets"}, + { + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "--port 8080"}}, + Type: model.ArgumentTypePositional, + }, // Can contain flags in value for positional + } + + for i, arg := range positionalCases { + t.Run(fmt.Sprintf("ValidPositional_%d", i), func(t *testing.T) { + server := createValidServerWithArgument(arg) + err := validators.ValidateServerJSON(&server) + assert.NoError(t, err, "Expected valid positional argument %+v", arg) + }) + } +} + +func TestValidateArgument_InvalidNamedArgumentNames(t *testing.T) { + invalidNameCases := []struct { + name string + arg model.Argument + }{ + {"contains_description", model.Argument{Type: model.ArgumentTypeNamed, Name: "--directory "}}, + {"contains_value", model.Argument{Type: model.ArgumentTypeNamed, Name: "--port 8080"}}, + {"contains_dollar", model.Argument{Type: model.ArgumentTypeNamed, Name: "--config $CONFIG_FILE"}}, + {"contains_brackets", model.Argument{Type: model.ArgumentTypeNamed, Name: "--file "}}, + {"empty_name", model.Argument{Type: model.ArgumentTypeNamed, Name: ""}}, + {"has_spaces", model.Argument{Type: model.ArgumentTypeNamed, Name: "name with spaces"}}, + } + + for _, tc := range invalidNameCases { + t.Run("Invalid_"+tc.name, func(t *testing.T) { + server := createValidServerWithArgument(tc.arg) + err := validators.ValidateServerJSON(&server) + assert.Error(t, err, "Expected error for invalid named argument name: %+v", tc.arg) + }) + } +} + +func TestValidateArgument_InvalidValueFields(t *testing.T) { + invalidValueCases := []struct { + name string + arg model.Argument + }{ + { + "value_starts_with_name", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "--port 8080"}}, + Type: model.ArgumentTypeNamed, + Name: "--port", + }, + }, + { + "default_starts_with_name", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Default: "--config /etc/app.conf"}}, + Type: model.ArgumentTypeNamed, + Name: "--config", + }, + }, + { + "value_starts_with_name_complex", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "--with-editable $REPOSITORY_DIRECTORY"}}, + Type: model.ArgumentTypeNamed, + Name: "--with-editable", + }, + }, + { + "default_starts_with_name_complex", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Default: "--with-editable $REPOSITORY_DIRECTORY"}}, + Type: model.ArgumentTypeNamed, + Name: "--with-editable", + }, + }, + } + + for _, tc := range invalidValueCases { + t.Run("Invalid_"+tc.name, func(t *testing.T) { + server := createValidServerWithArgument(tc.arg) + err := validators.ValidateServerJSON(&server) + assert.Error(t, err, "Expected error for argument with value starting with name: %+v", tc.arg) + }) + } +} + +func TestValidateArgument_ValidValueFields(t *testing.T) { + validValueCases := []struct { + name string + arg model.Argument + }{ + { + "value_without_name", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "8080"}}, + Type: model.ArgumentTypeNamed, + Name: "--port", + }, + }, + { + "default_without_name", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Default: "/etc/app.conf"}}, + Type: model.ArgumentTypeNamed, + Name: "--config", + }, + }, + { + "value_with_var", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "$REPOSITORY_DIRECTORY"}}, + Type: model.ArgumentTypeNamed, + Name: "--with-editable", + }, + }, + { + "absolute_path", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "/absolute/path/to/directory"}}, + Type: model.ArgumentTypeNamed, + Name: "--directory", + }, + }, + { + "contains_but_not_starts_with_name", + model.Argument{ + InputWithVariables: model.InputWithVariables{Input: model.Input{Value: "use --port for configuration"}}, + Type: model.ArgumentTypeNamed, + Name: "--port", + }, + }, + } + + for _, tc := range validValueCases { + t.Run("Valid_"+tc.name, func(t *testing.T) { + server := createValidServerWithArgument(tc.arg) + err := validators.ValidateServerJSON(&server) + assert.NoError(t, err, "Expected valid argument %+v", tc.arg) + }) + } +} + +// Helper function to create a valid server with a specific argument for testing +func createValidServerWithArgument(arg model.Argument) model.ServerJSON { + return model.ServerJSON{ + Name: "com.example/test-server", + Description: "A test server", + Repository: model.Repository{ + URL: "https://github.com/owner/repo", + Source: "github", + ID: "owner/repo", + }, + VersionDetail: model.VersionDetail{ + Version: "1.0.0", + }, + Packages: []model.Package{ + { + Identifier: "test-package", + RegistryType: "npm", + RegistryBaseURL: "https://registry.npmjs.org", + RuntimeArguments: []model.Argument{arg}, + }, + }, + Remotes: []model.Remote{ + { + URL: "https://example.com/remote", + }, + }, + } +} diff --git a/tools/validate-examples/main.go b/tools/validate-examples/main.go index 5ac033f..d6bc7c6 100644 --- a/tools/validate-examples/main.go +++ b/tools/validate-examples/main.go @@ -15,6 +15,8 @@ import ( "strings" jsonschema "github.com/santhosh-tekuri/jsonschema/v5" + "github.com/modelcontextprotocol/registry/pkg/model" + "github.com/modelcontextprotocol/registry/internal/validators" ) const ( @@ -65,52 +67,11 @@ func runValidation() error { } validatedCount := 0 + for i, example := range examples { log.Printf("Example %d:", i+1) - var data any - if err := json.Unmarshal([]byte(example.content), &data); err != nil { - log.Printf(" ❌ Invalid JSON: %v", err) - continue - } - - // Extract server portion if this is a PublishRequest format - serverData := data - publishRequestValid := true - if dataMap, ok := data.(map[string]any); ok { - if server, exists := dataMap["server"]; exists { - // This is a PublishRequest format - validate only expected properties exist - for key := range dataMap { - if key != "server" && key != "x-publisher" { - log.Printf(" Invalid PublishRequest property: ❌ %s (only 'server' and optional 'x-publisher' are allowed)", key) - publishRequestValid = false - } - } - serverData = server - } - } - - baseValid := false - registryValid := false - - if err := baseSchema.Validate(serverData); err != nil { - log.Printf(" Validating against server.schema.json: ❌") - log.Printf(" Error: %v", err) - } else { - log.Printf(" Validating against server.schema.json: ✅") - baseValid = true - } - - if err := registrySchema.Validate(serverData); err != nil { - log.Printf(" Validating against registry-schema.json: ❌") - log.Printf(" Error: %v", err) - } else { - log.Printf(" Validating against registry-schema.json: ✅") - registryValid = true - } - - // Only count as validated if all validations passed - if publishRequestValid && baseValid && registryValid { + if validateExample(example, baseSchema, registrySchema) { validatedCount++ } @@ -118,7 +79,7 @@ func runValidation() error { } if validatedCount != expectedExampleCount { - return fmt.Errorf("validation failed: expected %d examples to pass both validations but only %d did", + return fmt.Errorf("validation failed: expected %d examples to pass all validations but only %d did", expectedExampleCount, validatedCount) } @@ -126,6 +87,72 @@ func runValidation() error { return nil } +func validateExample(ex example, baseSchema, registrySchema *jsonschema.Schema) bool { + var data any + if err := json.Unmarshal([]byte(ex.content), &data); err != nil { + log.Printf(" ❌ Invalid JSON: %v", err) + return false + } + + // Extract server portion if this is a PublishRequest format + serverData := data + publishRequestValid := true + if dataMap, ok := data.(map[string]any); ok { + if server, exists := dataMap["server"]; exists { + // This is a PublishRequest format - validate only expected properties exist + for key := range dataMap { + if key != "server" && key != "x-publisher" { + log.Printf(" Invalid PublishRequest property: ❌ %s (only 'server' and optional 'x-publisher' are allowed)", key) + publishRequestValid = false + } + } + serverData = server + } + } + + baseValid := validateAgainstSchema(serverData, baseSchema, "server.schema.json") + registryValid := validateAgainstSchema(serverData, registrySchema, "registry-schema.json") + goValidatorValid := validateWithObjectValidator(serverData) + + // Only count as validated if all validations passed + return publishRequestValid && baseValid && registryValid && goValidatorValid +} + +func validateAgainstSchema(data any, schema *jsonschema.Schema, schemaName string) bool { + if err := schema.Validate(data); err != nil { + log.Printf(" Validating against %s: ❌", schemaName) + log.Printf(" Error: %v", err) + return false + } + log.Printf(" Validating against %s: ✅", schemaName) + return true +} + +func validateWithObjectValidator(serverData any) bool { + var serverDetail model.ServerJSON + serverDataBytes, err := json.Marshal(serverData) + if err != nil { + log.Printf(" Validating with Go Validator: ❌") + log.Printf(" Error marshaling server data: %v", err) + return false + } + + if err := json.Unmarshal(serverDataBytes, &serverDetail); err != nil { + log.Printf(" Validating with Go Validator: ❌") + log.Printf(" Error unmarshaling to ServerDetail: %v", err) + return false + } + + if err := validators.ValidateServerJSON(&serverDetail); err != nil { + log.Printf(" Validating with Go Validator: ❌") + log.Printf(" Error: %v", err) + return false + } + + log.Printf(" Validating with Go Validator: ✅") + return true +} + type example struct { content string line int