Skip to main content
Glama
README.md

# ๐Ÿฅ Hospital MCP Server  
Secure PostgreSQL Access via Model Context Protocol (MCP)  
**Claude Desktop acts as the MCP client**

This project implements a secure **Model Context Protocol (MCP)** server that connects to a PostgreSQL-based Hospital Management System.  
Claude Desktop communicates with this server and can safely query hospital data through defined, read-only MCP tools.

---

# ๐Ÿ“ Project Structure

```

MY-FIRST-MCP-SERVER/
โ”‚
โ”œโ”€โ”€ .venv/                # Virtual environment
โ”œโ”€โ”€ .env                  # Environment variables (DB credentials)
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ .python-version
โ”œโ”€โ”€ main.py               # MCP server implementation
โ”œโ”€โ”€ pyproject.toml        # Project dependencies (uv/poetry/pdm)
โ”œโ”€โ”€ README.md             # This documentation
โ””โ”€โ”€ uv.lock               # Dependency lockfile

````

---

# ๐Ÿ—„๏ธ 1. PostgreSQL Setup

You must create **secure read-only views** before exposing data to Claude.

### Create Views (Safe, non-sensitive)

```sql
CREATE VIEW doctors_view AS
SELECT doctor_id, department_id, specialization
FROM Doctors;

CREATE VIEW departments_view AS
SELECT department_id, name, head_doctor_id
FROM Departments;

CREATE VIEW public_appointments_view AS
SELECT appointment_id, patient_id, doctor_id, appointment_date
FROM Appointments;

CREATE VIEW rooms_view AS
SELECT room_id, room_number, current_status
FROM Rooms;

CREATE VIEW billing_summary_view AS
SELECT bill_id, patient_id, appointment_id, admission_id, total_amount
FROM Billing;
````

---

# ๐Ÿ” 2. Create Restricted DB Role

```sql
CREATE ROLE mcp_readonly LOGIN PASSWORD 'your_password';

GRANT SELECT ON doctors_view TO mcp_readonly;
GRANT SELECT ON departments_view TO mcp_readonly;
GRANT SELECT ON public_appointments_view TO mcp_readonly;
GRANT SELECT ON rooms_view TO mcp_readonly;
GRANT SELECT ON billing_summary_view TO mcp_readonly;

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM mcp_readonly;

ALTER ROLE mcp_readonly SET statement_timeout = '3s';
ALTER ROLE mcp_readonly SET idle_in_transaction_session_timeout = '2s';
```

Only the views are exposed โ€” raw PHI tables are protected.

---

# โš™๏ธ 3. Environment Variables (`.env`)

Your MCP server reads DB credentials from here:

```
DB_HOST=localhost
DB_PORT=5432
DB_NAME=hospital_db
DB_USER=mcp_readonly
DB_PASSWORD=your_password
```

---

# ๐Ÿง  4. MCP Server (`main.py`)

`main.py` runs your MCP server and exposes tools such as:

* `get_doctor_by_id`
* `list_doctors_by_department`
* `get_appointments_for_doctor`
* `check_room_status`
* `get_patient_billing_summary`

All SQL queries are:

โœ” parameterized
โœ” read-only
โœ” safely constrained

---

# ๐Ÿ”Œ 5. Installing Dependencies

Inside your project folder:

```bash
uv sync
```

Or if using pip manually:

```bash
pip install -r requirements.txt
```

(Dependencies are defined in `pyproject.toml`)

---

# ๐Ÿค 6. Connecting MCP Server to Claude Desktop

Claude Desktop automatically detects MCP servers placed in its extensions directory.


### `In your local file system  "C:\Users\shesh\AppData\Roaming\Claude\claude_desktop_config.json" edit this file with your configurations`

```json
{
  "mcpServers": {
    "postgres": {
      "command": "C:\\Users\\shesh\\my-first-mcp-server\\.venv\\Scripts\\python.exe",
      "args": [
        "C:\\Users\\shesh\\my-first-mcp-server\\main.py",
        "stdio"
      ],
      "cwd": "C:\\Users\\shesh\\my-first-mcp-server",
      "env": {
        "DB_HOST": "localhost",
        "DB_PORT": "5432",
        "DB_NAME": "db_name",
        "DB_USER": "postgres",
        "DB_PASSWORD": "your_password"
      }
    }
  }
}
```

---

### ๐Ÿ“ **Step 3 โ€” Restart Claude Desktop**

Go to:

**Claude Desktop โ†’ Settings โ†’ Developer**
You should see:

```
hospital-mcp (running)
```


Claude will now:

1. Launch your `main.py` MCP server
2. Discover available tools
3. Call them automatically during conversation

---

# ๐Ÿงช 7. Testing Inside Claude

In Claude Desktop you can ask:

```
Get the list of doctors in the cardiology department.
```

Claude will call:

```
list_doctors_by_department(department_id=1)
```

Or:

```
Show me appointments for doctor 3.
```

Claude โ†’ calls your MCP tool โ†’ your DB โ†’ safe output returned.

---

# ๐ŸŽฏ Summary

You now have:

โœ” A working **Python MCP server**
โœ” Secure **PostgreSQL integration**
โœ” Fully wired **Claude Desktop tool access**
โœ” Safe read-only hospital data views
โœ” Clean project structure

Claude Desktop communicates with your DB **only through your safe MCP tools**, never accessing raw tables directly.