Aihydro Tools MCP Server

aihydro-tools PyPI v2.1.0

Published by ai-hydro — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.

Trust grade
B
89/100
Last scanned get badge →
Trust
B · 89/100
Adoption risk for you: the threat score, then adjusted down for blast radius, publisher verification and how much the scan could see. Deterministic; every point is auditable.
Capability
Critical
Blast radius if it went rogue — what the server’s tools could reach. Independent of trust.
Coverage
Source
How much the scan could actually inspect. Shallow coverage is stated, never hidden.
Share this Trust Score
𝕏 Share LinkedIn Reddit
B Why this grade threat 100 − adoption risk = 89/100

The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.

1. Threat score — 100 − 0 = 100. What the published surface and source actually contain:

The deterministic scan raised no scored threat in the surface it inspected — the threat score stayed at 100. Capability observations and advisory notes are recorded but never lower it.

2. Client adoption risk — 100 − 11 = 89. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:

PointsAdoption-risk factor
−10 capability blast radius (critical) — client exposure if the model is manipulated
−1 publisher verification (public source) — no provenance, but the source is public and inspectable

Capability observations and info notes are shown under Findings but never scored. Open any row's finding below for the file, line and evidence behind a deduction.

Findings 7

critical Completed toxic-flow trifecta across toolsMTC-FLOW-002

This server (without client built-ins) exposes a complete data-exfiltration chain: check_record_length → list_available_tools → preview_list_modules. Untrusted input is ingested, private data is read, and it can be sent to an external sink via the agent composing the tools (→). Static analysis proves the primitive exists, not that a specific run will occur.

Fix: Remove one leg of the trifecta: isolate untrusted-input tools from secret-reading tools and from egress tools, or require human approval between them.

Location: flow check_record_length → list_available_tools → preview_list_modules

high Shell/command execution in server code (ai_hydro/gee/auth.py)MTC-SRC-002

In the server's implementation (`ai_hydro/gee/auth.py:84`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: try: proc = subprocess.run( ["gcloud", "projects", "list", "--format=json(projectId,name,project

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server ai_hydro/gee/auth.py

high Shell/command execution in server code (ai_hydro/mcp/tools_execution.py)MTC-SRC-002

In the server's implementation (`ai_hydro/mcp/tools_execution.py:90`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: onic() result = subprocess.run( [sys.executable, "-"], input=full_script, ca

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server ai_hydro/mcp/tools_execution.py

high Shell/command execution in server code (ai_hydro/mcp/tools_session.py)MTC-SRC-002

In the server's implementation (`ai_hydro/mcp/tools_session.py:56`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: p. result = subprocess.run( [sys.executable, "-m", "pip", "list", "--format=json"],

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server ai_hydro/mcp/tools_session.py

medium Hardcoded egress to an external endpoint (ai_hydro/gee/auth.py)MTC-SRC-003

In the server's implementation (`ai_hydro/gee/auth.py:131`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: t()) response = requests.get( "https://cloudresourcemanager.googleapis.com/v1/projects",

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server ai_hydro/gee/auth.py

low Shell/command execution in packaging/dev tooling (bench/gen_scorecard.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`bench/gen_scorecard.py:99`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: lush=True) result = subprocess.run(cmd, capture_output=False) print(f"Exit code: {result.returncode}", flush=Tru

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server bench/gen_scorecard.py

low Shell/command execution in packaging/dev tooling (tests/test_capsule.py)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`tests/test_capsule.py:448`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: eypatch) proc = subprocess.run( [sys.executable, str(cap / "replay.py")], capture_output

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server tests/test_capsule.py

Tools 147

Each tool and what it can reach — statically extracted from the published source.

  • check_record_lengthingests untrusted input
  • check_usgs_qualification_codesingests untrusted input
  • compute_flow_duration_curveingests untrusted input
  • data_fetch_backgroundingests untrusted input
  • describe_toolingests untrusted input
  • describe_toolsingests untrusted input
  • fetch_camels_usingests untrusted input
  • fetch_forcing_dataingests untrusted input
  • fetch_streamflow_dataingests untrusted input
  • get_data_fetch_resultingests untrusted input
Show 137 more tools ↓
  • list_available_toolsreads sensitive data
  • preview_list_modulesnetwork egress
  • add_assumptionno sensitive capability
  • add_claimno sensitive capability
  • add_journal_entryno sensitive capability
  • add_noteno sensitive capability
  • add_session_to_projectno sensitive capability
  • aihydro_chat_statusno sensitive capability
  • aihydro_describe_capabilityno sensitive capability
  • aihydro_rebind_chatno sensitive capability
  • archive_sessionno sensitive capability
  • audit_interpretationno sensitive capability
  • bind_map_to_claimno sensitive capability
  • cancel_jobno sensitive capability
  • check_registry_stalenessno sensitive capability
  • check_regulated_basinno sensitive capability
  • check_stationarityno sensitive capability
  • check_temporal_alignmentno sensitive capability
  • check_unit_consistencyno sensitive capability
  • check_water_balance_consistencyno sensitive capability
  • clear_sessionno sensitive capability
  • compute_design_hydrographno sensitive capability
  • compute_drought_indexno sensitive capability
  • compute_flood_frequencyno sensitive capability
  • compute_soil_loss_rusleno sensitive capability
  • compute_spectral_indexno sensitive capability
  • compute_twino sensitive capability
  • course_get_curriculumno sensitive capability
  • course_get_stateno sensitive capability
  • course_navigateno sensitive capability
  • course_scaffoldno sensitive capability
  • course_set_progressno sensitive capability
  • create_cn_gridno sensitive capability
  • define_experimentno sensitive capability
  • delineate_watershedno sensitive capability
  • delineate_watershed_from_pointno sensitive capability
  • delineation_doctorno sensitive capability
  • describe_model_spaceno sensitive capability
  • draft_claim_from_runno sensitive capability
  • export_inundation_surrogate_datasetno sensitive capability
  • export_sessionno sensitive capability
  • extract_geomorphic_parametersno sensitive capability
  • extract_hydrological_signaturesno sensitive capability
  • gee.extract_timeseriesno sensitive capability
  • gee.preview_layerno sensitive capability
  • gee.statusno sensitive capability
  • get_citation_by_doino sensitive capability
  • get_dataset_infono sensitive capability
  • get_equation_definitionno sensitive capability
  • get_experiment_tableno sensitive capability
  • get_inundation_physics_resultno sensitive capability
  • get_inundation_surrogate_resultno sensitive capability
  • get_leaderboardno sensitive capability
  • get_library_referenceno sensitive capability
  • get_metric_definitionno sensitive capability
  • get_model_resultsno sensitive capability
  • get_project_summaryno sensitive capability
  • get_researcher_profileno sensitive capability
  • get_session_healthno sensitive capability
  • get_session_raw_stateno sensitive capability
  • get_session_summaryno sensitive capability
  • get_training_statusno sensitive capability
  • get_variable_definitionno sensitive capability
  • get_workflow_manifestno sensitive capability
  • index_literatureno sensitive capability
  • index_passagesno sensitive capability
  • list_assumptionsno sensitive capability
  • list_available_workflowsno sensitive capability
  • list_cached_citationsno sensitive capability
  • list_claimsno sensitive capability
  • list_featuresno sensitive capability
  • list_jobsno sensitive capability
  • list_known_datasetsno sensitive capability
  • list_known_metricsno sensitive capability
  • list_known_variablesno sensitive capability
  • list_registry_claimsno sensitive capability
  • list_relevant_clisno sensitive capability
  • list_skillsno sensitive capability
  • list_spectral_indicesno sensitive capability
  • load_skillno sensitive capability
  • log_researcher_observationno sensitive capability
  • lookup_citationno sensitive capability
  • map_add_layer_from_runno sensitive capability
  • map_apply_symbologyno sensitive capability
  • map_fit_extentno sensitive capability
  • map_fit_layerno sensitive capability
  • map_flood_inundationno sensitive capability
  • map_flood_inundation_hydrographno sensitive capability
  • map_fly_tono sensitive capability
  • map_get_stateno sensitive capability
  • map_list_layersno sensitive capability
  • map_remove_layerno sensitive capability
  • map_save_roino sensitive capability
  • map_set_basemapno sensitive capability
  • map_set_roino sensitive capability
  • map_set_time_rangeno sensitive capability
  • map_set_working_geometryno sensitive capability
  • map_showno sensitive capability
  • map_update_layerno sensitive capability
  • merge_session_shardsno sensitive capability
  • merit_add_map_layersno sensitive capability
  • merit_ensure_basinno sensitive capability
  • merit_ensure_basins_regionno sensitive capability
  • merit_ensure_regionno sensitive capability
  • merit_ensure_routing_regionno sensitive capability
  • preview_address_commentno sensitive capability
  • preview_focus_cellno sensitive capability
  • preview_get_pending_changesno sensitive capability
  • preview_get_stateno sensitive capability
  • preview_recent_eventsno sensitive capability
  • preview_revise_sectionno sensitive capability
  • promote_claim_to_registryno sensitive capability
  • propose_and_trainno sensitive capability
  • register_featureno sensitive capability
  • register_research_planno sensitive capability
  • resolve_passageno sensitive capability
  • run_autoresearchno sensitive capability
  • run_experimentno sensitive capability
  • run_inundation_physics_validationno sensitive capability
  • run_pythonno sensitive capability
  • run_skepticno sensitive capability
  • save_skillno sensitive capability
  • search_experimentsno sensitive capability
  • search_literatureno sensitive capability
  • search_passages_toolno sensitive capability
  • separate_baseflowno sensitive capability
  • set_active_featureno sensitive capability
  • show_html_previewno sensitive capability
  • show_on_mapno sensitive capability
  • start_projectno sensitive capability
  • start_sessionno sensitive capability
  • train_hydro_modelno sensitive capability
  • train_inundation_surrogateno sensitive capability
  • update_claim_statusno sensitive capability
  • update_researcher_profileno sensitive capability
  • wait_for_jobno sensitive capability
  • write_research_interpretationno sensitive capability

Toxic flows 1

Cross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).

What this scan could not see

Versions 1

Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.

VersionScoreFindingsEngineScanned
v2.1.0 latest B 89/100 7 1.9.0 2026-07-23

Embed this score

Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.

MCP Trust Score: B · 89/100
Markdown (GitHub README)
[![MCP Trust Score](https://mcptrustchecker.com/registry/aihydro-tools/badge.svg)](https://mcptrustchecker.com/registry/aihydro-tools)
HTML
<a href="https://mcptrustchecker.com/registry/aihydro-tools"><img src="https://mcptrustchecker.com/registry/aihydro-tools/badge.svg" alt="MCP Trust Score" height="20"></a>
Prefer shields.io styling? Point it at https://mcptrustchecker.com/registry/aihydro-tools/badge.json via https://img.shields.io/endpoint?url=…

Verify this score yourself

The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.

npx mcptrustchecker scan aihydro-tools --online --registry pypi

Use the free API → How scoring works

More in Analytics & Monitoring