{"name":"io.github.rpconroy/gdex-mcp","slug":"rpconroy-gdex-mcp","title":null,"description":"MCP server for the GDEX (Geoscience Data Exchange) data portal: datasets, files, metrics, subsetting","url":"https://mcp.market/server/rpconroy-gdex-mcp","rating":null,"grade":"B","score":79,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":20,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-24T19:55:18.000Z","license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T09:20:25.976Z","last_ok_at":"2026-11-04T09:20:25.976Z","latency_ms":1323},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/NCAR/gdex-mcp","website":null,"version":"0.1.0","remotes":[{"type":"streamable-http","url":"https://gdex-mcp.k8s.ucar.edu/mcp"}],"packages":[],"tools":[{"name":"check_request_status","description":"Check the status of a specific subsetting request. Requires GDEX_TOKEN.\n\n    Args:\n        rindex: Request index/ID\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"rindex":{"title":"Rindex","type":"string"}},"required":["rindex"],"title":"check_request_statusArguments"}},{"name":"describe_dataset","description":"Return a combined overview of a dataset — abstract, temporal coverage,\n    spatial coverage, variables, data formats, and volume — in a single call.\n\n    Prefer this over calling get_dataset_field repeatedly when the user wants\n    a general summary of a dataset. If one of the underlying fields fails to\n    load, it's returned as {\"error\": ...} rather than failing the whole call.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"describe_datasetArguments"}},{"name":"find_dataset_files","description":"Search a dataset's file-group hierarchy for files matching a name\n    pattern (e.g. a date like \"20220808\"), without ever pulling a large,\n    context-blowing file listing.\n\n    Automates the pattern described in get_file_groups: recursively calls\n    get_file_groups, descending into every child gindex, until a gindex\n    returns no further children (a leaf group) — then calls get_dataset_files\n    there with filter_wfile=name_pattern and keeps only the matches. Prefer\n    this over manually drilling with get_file_groups/get_dataset_files when\n    you don't already know roughly where in the hierarchy to look.\n\n    A dataset's hierarchy can be large (hundreds of leaf groups), and this\n    tool has no way to know in advance which branches might contain a match,\n    so it may need to visit many groups to be thorough. Pass start_gindex if\n    you already know a good starting point (e.g. from a prior get_file_groups\n    call, or a related dataset's structure) to narrow and speed up the\n    search. If the number of groups visited hits max_groups_visited, the\n    search stops early and `stopped_early` comes back true — narrow with\n    start_gindex and retry, or raise the cap.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        name_pattern: Filename substring/pattern to match, e.g. \"20220808\" for a date\n        start_gindex: Optional group index to start the search from, instead of the dataset root\n        max_groups_visited: Safety cap on groups traversed before giving up (default 300)\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"name_pattern":{"title":"Name Pattern","type":"string"},"start_gindex":{"default":"","title":"Start Gindex","type":"string"},"max_groups_visited":{"default":300,"title":"Max Groups Visited","type":"integer"}},"required":["dsid","name_pattern"],"title":"find_dataset_filesArguments"}},{"name":"get_arco_variables","description":"Return the list of ARCO variables available for a dataset.\n\n    Each row's type (index 2) is either \"zarr\" or \"reference\" (kerchunk).\n    A \"reference\" variable is often listed multiple times, once per kerchunk\n    reference variant (plain, \"-remote-https\", \"-remote-osdf\", etc.) — always\n    pick the \"-osdf\" variant's URL; the others' chunk targets can be internal\n    paths that only resolve on NCAR's network. Open it with\n    xr.open_dataset(url, engine=\"kerchunk\", storage_options={\"remote_protocol\":\n    \"https\", \"lazy\": True}) — that's better behaved than hand-building an\n    fsspec reference filesystem. A \"zarr\" row needs no variant picking — its\n    URL already routes through the OSDF director (rewritten automatically);\n    open it directly with xr.open_dataset(url, engine=\"zarr\").\n\n    Results are capped at 300 rows (look for \"truncated\": true); narrow with\n    search_arco_variables if you hit the cap.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"get_arco_variablesArguments"}},{"name":"get_control_file_template","description":"Return the control file template for building a subsetting request for a dataset.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"get_control_file_templateArguments"}},{"name":"get_data_access","description":"Return data access options for a dataset — download links, Globus URLs, access methods.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"get_data_accessArguments"}},{"name":"get_dataset_field","description":"Return one metadata field for a dataset.\n\n    Prefer describe_dataset when the user wants a general summary covering\n    several of these at once (abstract, temporal, spatial_coverage,\n    variables, data_formats, volume) — this tool is for pulling a single\n    field, including the fields describe_dataset doesn't cover\n    (publications, contributors, related_datasets, documentation).\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        field: One of: abstract, variables, temporal, spatial_coverage,\n               publications, contributors, data_formats, volume,\n               related_datasets, documentation\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"field":{"title":"Field","type":"string"}},"required":["dsid","field"],"title":"get_dataset_fieldArguments"}},{"name":"get_dataset_files","description":"Return a paginated file listing for a dataset or a specific group.\n\n    Depending on how deep gindex is in the group hierarchy, this returns\n    either actual file rows or another layer of subgroup summaries — there's\n    no way to tell in advance which you'll get. If you get subgroups, read\n    the gindex (or url) off a row and call again with that gindex to go one\n    level deeper; gindex values are dataset-specific and can't be guessed.\n\n    A shallow gindex on a large dataset can return a very large response\n    (thousands of files) — the file-row portion of the response is capped at\n    500 rows (look for \"_truncated\": true). Two ways to avoid hitting that\n    cap instead of drilling down group by group: pass filter_wfile with a\n    filename pattern (e.g. a date like \"20220808\") to filter down to matching\n    files, or page through a known group's results with `page`. filter_wfile\n    only filters actual file rows, so it has no effect at a gindex that's\n    still returning a subgroup summary rather than files — if a first attempt\n    comes back unfiltered, descend one level (see get_file_groups) and retry\n    there.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        gindex: Optional group index to filter files\n        page: Page number to fetch (for a group with more files than fit on one page)\n        filter_wfile: Filter files by name pattern, e.g. \"20220808\" to match a date\n        fl: File list source (defaults to \"web\" server-side)\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"gindex":{"default":"","title":"Gindex","type":"string"},"page":{"default":0,"title":"Page","type":"integer"},"filter_wfile":{"default":"","title":"Filter Wfile","type":"string"},"fl":{"default":"","title":"Fl","type":"string"}},"required":["dsid"],"title":"get_dataset_filesArguments"}},{"name":"get_dataset_metadata","description":"Return full metadata for a GDEX dataset (parameters, temporal range, spatial coverage, etc.).\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"get_dataset_metadataArguments"}},{"name":"get_dataset_metrics","description":"Return a per-dataset metric.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        metric: One of: users_month, users_year, volume_month, volume_year\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"metric":{"default":"volume_year","title":"Metric","type":"string"}},"required":["dsid"],"title":"get_dataset_metricsArguments"}},{"name":"get_file_groups","description":"Return file groups for a dataset. Pass gindex to get child groups under a parent.\n\n    Groups nest (dataset -> format -> year -> month, or similar, varying by\n    dataset) and there's no way to predict a child's gindex in advance — each\n    group's gindex/url is dataset-specific and only knowable from the parent\n    response. To drill down, read the gindex (or url) off a row in this\n    response and pass that as the next call's gindex.\n\n    This never returns file rows, only groups — every response stays small\n    regardless of how many files the dataset holds, unlike get_dataset_files.\n    Descend until a call returns empty ({} or []): that means the gindex you\n    just called with is a leaf with no further subgroups, so it's safe to\n    call get_dataset_files there for the actual files. find_dataset_files\n    automates exactly this walk if you'd rather not do it by hand.\n\n    At the top level, watch for a \"Kerchunk Reference Files\" (or similar\n    ARCO-related) group alongside the raw-format groups. For an analysis\n    task, prefer pulling from there (see also has_arco/get_arco_variables)\n    over a raw data file when one's available — it avoids downloading a\n    whole file just to read a subset of it.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        gindex: Optional group index to fetch child groups\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"gindex":{"default":"","title":"Gindex","type":"string"}},"required":["dsid"],"title":"get_file_groupsArguments"}},{"name":"get_filesearch_cyclone_fix_files","description":"Search for data files containing \"cyclone_fix\" datatype data, optionally\n    filtered by time range. Results are paginated; use get_filesearch_result_page\n    with the returned result_id to fetch additional pages.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        valid_datetime_min: Restrict to data valid on/after \"YYYY-MM-DD HH:MM\"\n        valid_datetime_max: Restrict to data valid on/before \"YYYY-MM-DD HH:MM\"\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"valid_datetime_min":{"default":"","title":"Valid Datetime Min","type":"string"},"valid_datetime_max":{"default":"","title":"Valid Datetime Max","type":"string"}},"required":["dsid"],"title":"get_filesearch_cyclone_fix_filesArguments"}},{"name":"get_filesearch_cyclone_fix_filters","description":"Return the valid date range and other filters for \"cyclone_fix\"\n    datatype file search on a dataset.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        valid_datetime_min: Restrict to data valid on/after \"YYYY-MM-DD HH:MM\"\n        valid_datetime_max: Restrict to data valid on/before \"YYYY-MM-DD HH:MM\"\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"valid_datetime_min":{"default":"","title":"Valid Datetime Min","type":"string"},"valid_datetime_max":{"default":"","title":"Valid Datetime Max","type":"string"}},"required":["dsid"],"title":"get_filesearch_cyclone_fix_filtersArguments"}},{"name":"get_filesearch_datatypes","description":"Return the file-search datatypes available for a dataset (a subset of\n    \"grid\", \"cyclone_fix\", \"sensor\"). Call this before the other filesearch_*\n    tools to know which one(s) apply — a dataset only supports search for the\n    datatypes it actually contains.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"get_filesearch_datatypesArguments"}},{"name":"get_filesearch_grid_files","description":"Search for data files containing \"grid\" datatype data, filtered by\n    parameter code(s) and optionally by time range, product, grid, or level.\n    Results are paginated; use get_filesearch_result_page with the returned\n    result_id to fetch additional pages. Use get_filesearch_grid_filters\n    first to find valid parameter/product/grid/level codes for this dataset.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        parameters: Parameter code(s) to search for (required, at least one)\n        valid_datetime_min: Restrict to data valid on/after \"YYYY-MM-DD HH:MM\"\n        valid_datetime_max: Restrict to data valid on/before \"YYYY-MM-DD HH:MM\"\n        products: Restrict to specified product code(s)\n        grids: Restrict to specified grid code(s)\n        levels: Restrict to specified vertical level code(s)\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"parameters":{"items":{"type":"string"},"title":"Parameters","type":"array"},"valid_datetime_min":{"default":"","title":"Valid Datetime Min","type":"string"},"valid_datetime_max":{"default":"","title":"Valid Datetime Max","type":"string"},"products":{"default":[],"items":{"type":"string"},"title":"Products","type":"array"},"grids":{"default":[],"items":{"type":"string"},"title":"Grids","type":"array"},"levels":{"default":[],"items":{"type":"string"},"title":"Levels","type":"array"}},"required":["dsid","parameters"],"title":"get_filesearch_grid_filesArguments"}},{"name":"get_filesearch_grid_filters","description":"Return the valid parameter/product/grid/level codes and date range for\n    \"grid\" datatype file search on a dataset. Use this to discover the codes\n    to pass to get_filesearch_grid_files, optionally narrowed by any filters\n    you already know you want.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        valid_datetime_min: Restrict to data valid on/after \"YYYY-MM-DD HH:MM\"\n        valid_datetime_max: Restrict to data valid on/before \"YYYY-MM-DD HH:MM\"\n        parameters: Restrict to specified parameter code(s)\n        products: Restrict to specified product code(s)\n        grids: Restrict to specified grid code(s)\n        levels: Restrict to specified vertical level code(s)\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"valid_datetime_min":{"default":"","title":"Valid Datetime Min","type":"string"},"valid_datetime_max":{"default":"","title":"Valid Datetime Max","type":"string"},"parameters":{"default":[],"items":{"type":"string"},"title":"Parameters","type":"array"},"products":{"default":[],"items":{"type":"string"},"title":"Products","type":"array"},"grids":{"default":[],"items":{"type":"string"},"title":"Grids","type":"array"},"levels":{"default":[],"items":{"type":"string"},"title":"Levels","type":"array"}},"required":["dsid"],"title":"get_filesearch_grid_filtersArguments"}},{"name":"get_filesearch_result_page","description":"Return a page of results from a previous get_filesearch_*_files call, by\n    its result_id. Use this to page through file-search results beyond the\n    first page (see the \"pagination\" block of a files/results response for\n    num_pages and next_page).\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        result_id: The result_id from a previous filesearch files/results response\n        page_num: Page number to retrieve\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"result_id":{"title":"Result Id","type":"string"},"page_num":{"title":"Page Num","type":"integer"}},"required":["dsid","result_id","page_num"],"title":"get_filesearch_result_pageArguments"}},{"name":"get_filesearch_sensor_files","description":"Search for data files containing \"sensor\" datatype data, optionally\n    filtered by date range. Results are paginated; use get_filesearch_result_page\n    with the returned result_id to fetch additional pages.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        valid_date_min: Restrict to data valid on/after \"YYYY-MM-DD\"\n        valid_date_max: Restrict to data valid on/before \"YYYY-MM-DD\"\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"valid_date_min":{"default":"","title":"Valid Date Min","type":"string"},"valid_date_max":{"default":"","title":"Valid Date Max","type":"string"}},"required":["dsid"],"title":"get_filesearch_sensor_filesArguments"}},{"name":"get_filesearch_sensor_filters","description":"Return the valid date range and other filters for \"sensor\" datatype\n    file search on a dataset.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        valid_date_min: Restrict to data valid on/after \"YYYY-MM-DD\"\n        valid_date_max: Restrict to data valid on/before \"YYYY-MM-DD\"\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"valid_date_min":{"default":"","title":"Valid Date Min","type":"string"},"valid_date_max":{"default":"","title":"Valid Date Max","type":"string"}},"required":["dsid"],"title":"get_filesearch_sensor_filtersArguments"}},{"name":"get_portal_metrics","description":"Return a GDEX portal-wide metric.\n\n    Args:\n        metric: One of: volume_downloaded, unique_users, total_datasets,\n                total_citations, gdex_volume, total_requests, top_datasets, ai_datasets\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"metric":{"default":"top_datasets","title":"Metric","type":"string"}},"title":"get_portal_metricsArguments"}},{"name":"get_request_files","description":"Return the output files for a completed subsetting request. Requires GDEX_TOKEN.\n\n    Args:\n        rindex: Request index/ID\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"rindex":{"title":"Rindex","type":"string"}},"required":["rindex"],"title":"get_request_filesArguments"}},{"name":"get_staff","description":"Return GDEX staff contacts, optionally filtered to a specific dataset.\n\n    Args:\n        dsid: Optional dataset ID. If omitted, returns all staff.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"default":"","title":"Dsid","type":"string"}},"title":"get_staffArguments"}},{"name":"has_arco","description":"Check whether Analysis-Ready Cloud-Optimized (ARCO) data is available for a dataset.\n\n    For analysis tasks, call this (and check for a \"Kerchunk Reference Files\"\n    group via get_file_groups) before reaching for raw data files — reading\n    through ARCO/kerchunk references avoids downloading whole files just to\n    subset them. When picking among kerchunk reference variants, always use\n    the one with \"-osdf\" in its name (see get_arco_variables) — other\n    variants' chunk targets can be internal paths that only resolve on\n    NCAR's network. Open it with xr.open_dataset(url, engine=\"kerchunk\",\n    storage_options={\"remote_protocol\": \"https\", \"lazy\": True}) rather than\n    hand-building an fsspec reference filesystem.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"}},"required":["dsid"],"title":"has_arcoArguments"}},{"name":"list_datasets","description":"List datasets available on GDEX, with their IDs and titles.\n\n    The full catalog has ~1700 datasets — far too many to return at once.\n    Always pass `query` to filter by keyword unless the user specifically\n    wants to browse the whole catalog page by page.\n\n    Args:\n        query: Keyword(s) to filter by, matched case-insensitively as a substring\n               against dataset id and title. Leave empty to browse unfiltered.\n        limit: Max number of datasets to return (default 50, capped at 500)\n        offset: Number of matching datasets to skip, for paging through results\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"default":"","title":"Query","type":"string"},"limit":{"default":50,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"}},"title":"list_datasetsArguments"}},{"name":"list_request_statuses","description":"List all subsetting request statuses for the authenticated user. Requires GDEX_TOKEN.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"title":"list_request_statusesArguments"}},{"name":"purge_request","description":"Delete a subsetting request and its output files. Requires GDEX_TOKEN.\n\n    Args:\n        rindex: Request index/ID to purge\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"rindex":{"title":"Rindex","type":"string"}},"required":["rindex"],"title":"purge_requestArguments"}},{"name":"search_arco_variables","description":"Search ARCO variables by name for a dataset.\n\n    As with get_arco_variables, a \"reference\" (kerchunk) match is often\n    listed once per variant — always pick the \"-osdf\" variant's URL (reachable\n    from anywhere), and open it with xr.open_dataset(url, engine=\"kerchunk\",\n    storage_options={\"remote_protocol\": \"https\", \"lazy\": True}). A \"zarr\"\n    match needs no variant picking — its URL already routes through the OSDF\n    director (rewritten automatically); open it directly with\n    xr.open_dataset(url, engine=\"zarr\").\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        query: Search text to match against variable names\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"query":{"title":"Query","type":"string"}},"required":["dsid","query"],"title":"search_arco_variablesArguments"}},{"name":"submit_and_wait_for_request","description":"Submit a subset request and poll its status until it finishes, fails, or\n    timeout_s elapses — instead of calling submit_subset_request and then\n    manually looping on check_request_status. Requires GDEX_TOKEN.\n\n    GDEX's API schema doesn't document the exact status vocabulary, so\n    \"finished\" is a best-effort match on the status text (words like\n    \"complete\" vs. \"error\"/\"fail\"). If the outcome comes back \"timeout\", that\n    means the request is still pending by our reading, not that it failed —\n    keep polling with check_request_status(rindex), or re-run this tool with\n    a longer timeout_s. If it comes back \"unknown\", the status payload didn't\n    contain a field we recognize; inspect the raw \"status\" value yourself.\n\n    Args:\n        request_json: JSON string of the subsetting request body (see get_control_file_template).\n        poll_interval_s: Seconds between status checks (default 15, minimum 5).\n        timeout_s: Give up and return the last-seen status after this many seconds (default 600).\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"request_json":{"title":"Request Json","type":"string"},"poll_interval_s":{"default":15,"title":"Poll Interval S","type":"integer"},"timeout_s":{"default":600,"title":"Timeout S","type":"integer"}},"required":["request_json"],"title":"submit_and_wait_for_requestArguments"}},{"name":"submit_subset_request","description":"Submit a data subset request to GDEX. Requires GDEX_TOKEN.\n\n    Args:\n        request_json: JSON string of the subsetting request body. Use get_control_file_template\n                      to get the expected structure for a dataset, or validate_subset_request\n                      to check it before submitting.\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"request_json":{"title":"Request Json","type":"string"}},"required":["request_json"],"title":"submit_subset_requestArguments"}},{"name":"validate_subset_request","description":"Check a subset request body against the dataset's control file template,\n    without submitting anything. Use this before submit_subset_request to catch\n    missing or unrecognized fields fast, instead of finding out from a failed\n    API call.\n\n    Args:\n        dsid: Dataset ID (dNNNNNN), e.g. d083002\n        request_json: JSON string of the subsetting request body to validate\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dsid":{"title":"Dsid","type":"string"},"request_json":{"title":"Request Json","type":"string"}},"required":["dsid","request_json"],"title":"validate_subset_requestArguments"}}],"scan":{"score":79,"grade":"B","scanned_at":"2026-09-24T21:39:34.239Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T21:39:34.199Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1097ms"]},"poisoning":{"score":15,"max":15,"notes":["30 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":6,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://gdex-mcp.k8s.ucar.edu/mcp","reachable":true,"authRequired":false,"latencyMs":1097,"serverInfo":{"name":"gdex","version":"1.30.0"}}],"packages":[],"repo":{"found":true,"owner":"NCAR","repo":"gdex-mcp","archived":false,"pushedAt":"2026-09-24T19:55:18Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/2007542?v=4","ownerCreatedAt":"2012-07-19T20:37:34Z"},"icon":{"url":"https://avatars.githubusercontent.com/u/2007542?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-09-24T19:55:18.000Z","score":20}}}},"grade_history":[],"reviews":[]}