razaali10's picture
Upload 6 files
758eab6 verified
|
Raw
History Blame Contribute Delete
4.63 kB
---
title: Hydraulic Solver MCP Server
emoji: 💧
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
---
# Hydraulic Solver MCP + REST Server
This repository exposes the Hydraulic Solver Teaching Mode backend as two agent-facing surfaces over the same `hydraulic_core.py`.
| Surface | File | Serves |
|---|---|---|
| MCP server | `server.py` | Claude, Cursor, LM Studio, n8n, HuggingChat, Codex, LangChain/LangGraph, AutoGen |
| REST / OpenAPI | `rest_api.py` | ChatGPT Custom GPT Actions, Gemini, Zapier/Make/curl, HTTP clients |
The tool set is intentionally deterministic. The Gradio Space remains the human-facing teaching app; this server is the agent-facing calculation layer.
## Included tools
- `load_network`
- `upload_network`
- `close_session`
- `network_summary`
- `solve_single_pipe`
- `solve_hardy_cross_loop`
- `solve_two_loop_hardy_cross`
- `solve_three_reservoir`
- `solve_pdd_demand`
- `simulate_tank_eps`
- `evaluate_valve_behavior`
- `solve_pump_operating_point`
- `pressure_zone_analysis`
- `leakage_nrw_analysis`
- `water_age_analysis`
- `chlorine_decay_analysis`
- `generate_epanet_validation_inp`
## Unit systems
| Quantity | MKS | FPS |
|---|---:|---:|
| Flow/demand | L/s | gpm |
| Length/head | m | ft |
| Diameter | mm | in |
| Pressure | m of head | psi |
Internal calculations are SI-normalized.
## Local stdio MCP
```bash
pip install -r requirements.txt
python server.py
```
Claude Desktop local config:
```json
{
"mcpServers": {
"hydraulic-solver": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}
```
## Remote MCP on HF Spaces
The included `Dockerfile` runs MCP HTTP by default on port 7860.
Set Space secret:
```text
CLIENT_API_KEY=your-secret
```
Run command used by Docker:
```bash
TRANSPORT=http PORT=7860 python server.py
```
Expected MCP URL:
```text
https://your-space.hf.space/mcp
```
Some clients use SSE:
```bash
TRANSPORT=sse PORT=7860 python server.py
```
Expected SSE URL:
```text
https://your-space.hf.space/sse
```
## REST / OpenAPI surface
Run locally:
```bash
CLIENT_API_KEY=your-secret uvicorn rest_api:app --host 0.0.0.0 --port 8000
```
OpenAPI schema:
```text
http://localhost:8000/openapi.json
```
Interactive docs:
```text
http://localhost:8000/docs
```
For a REST HF Space, change the Dockerfile command to:
```dockerfile
CMD ["uvicorn", "rest_api:app", "--host", "0.0.0.0", "--port", "7860"]
```
Then use:
```text
https://your-rest-space.hf.space/openapi.json
```
## Platform guide
| Platform | Surface | Transport |
|---|---|---|
| Claude Desktop | MCP | stdio local or SSE remote via mcp-remote |
| Claude.ai web | MCP | Streamable HTTP |
| Cursor | MCP | stdio or HTTP |
| LM Studio | MCP | stdio or HTTP |
| n8n | MCP | HTTP Streamable |
| HuggingChat | MCP | Streamable HTTP |
| Codex | MCP | Streamable HTTP |
| LangChain / LangGraph | MCP | `langchain-mcp-adapters` |
| AutoGen | MCP | MCP extension |
| ChatGPT Custom GPT | REST | OpenAPI Action |
| Gemini | REST | OpenAPI function tool |
| Zapier / Make / curl | REST | HTTP |
## ChatGPT Custom GPT Action
Use the REST surface, not MCP.
In GPT Builder:
1. Create Action
2. Import schema from URL:
```text
https://your-rest-space.hf.space/openapi.json
```
3. Authentication:
- API Key
- Bearer
- paste your secret
## Example REST call
```bash
curl -X POST "https://your-rest-space.hf.space/tools/solve_three_reservoir" \
-H "Authorization: Bearer your-secret" \
-H "Content-Type: application/json" \
-d '{
"unit_system": "MKS / L/s",
"reservoir_heads": [140, 120, 105],
"demand": 20,
"initial_head": 100,
"lengths": [500, 700, 600],
"diameters": [300, 250, 250],
"c_values": [120, 120, 120]
}'
```
## Important note
This package exposes the current teaching solvers and component-learning calculations. It is prepared for later WNTR/EPANET engine wiring, but it does not yet run a full WNTR hydraulic simulation unless you add a WNTR layer.
## HF App tab shows "Not Found" — fixed in v2
A pure MCP server does not behave like a Gradio app. The actual MCP endpoint is `/mcp`, so opening the Space root URL in a browser may show `Not Found` if no landing route is defined.
This v2 package adds:
- `/` human-readable status page
- `/health` JSON health check
- `/mcp` Streamable HTTP MCP endpoint
- bearer-token middleware for MCP routes when `CLIENT_API_KEY` is set
Expected browser checks:
```text
https://your-space.hf.space/
https://your-space.hf.space/health
```
Expected MCP client URL:
```text
https://your-space.hf.space/mcp
```