File size: 6,398 Bytes
108bca8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6682851
54ea9d4
6682851
108bca8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54ea9d4
6682851
54ea9d4
 
 
6682851
54ea9d4
6682851
54ea9d4
6682851
54ea9d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6682851
54ea9d4
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
---
title: CredentialWatch MCP Server
emoji: 🩺
colorFrom: blue
colorTo: purple
sdk: gradio
python_version: 3.11
sdk_version: 6.0.1
app_file: app.py
fullWidth: true
short_description: "Gradio MCP server exposing healthcare credential tools."
tags:
  - mcp
  - gradio
  - tools
  - healthcare
pinned: false
---

# CredentialWatch MCP Server

**CredentialWatch** is a proactive healthcare credential management system built for the **Hugging Face MCP 1st Birthday / Gradio Agents Hackathon**. It leverages the **Model Context Protocol (MCP)**, **LangGraph** agents, **Gradio**, and **Modal** to unify fragmented credential data and alert on upcoming expiries.

## Hugging Face Space

This repository is designed to run as a **Gradio Space**.

- SDK: Gradio (`sdk: gradio` in the README header)
- Entry file: `app.py` (set via `app_file` in the YAML header)
- Python: 3.11+ (pinned with `python_version`)

When you push this repo to a Space with SDK = **Gradio**, the UI and the MCP server will be started automatically.

### Configuration

The server requires the backend Credential API URL to be configured. In your Space settings (or local `.env` file), add:

```env
CRED_API_BASE_URL=http://localhost:8000  # Replace with actual backend URL
```

## MCP Server

This Space exposes its tools via **Model Context Protocol (MCP)** using Gradio.

### How MCP is enabled

In `app.py` we:

- install Gradio with MCP support: `pip install "gradio[mcp]"`
- define typed Python functions with docstrings
- launch the app with MCP support:

```python
demo.launch(mcp_server=True)
```

### MCP endpoints

When the Space is running, Gradio exposes:

- MCP SSE endpoint: `https://<space-host>/gradio_api/mcp/sse`
- MCP schema: `https://<space-host>/gradio_api/mcp/schema`

## Using this Space from an MCP client

### Easiest: Hugging Face MCP Server (no manual config)

1. Go to your HF **MCP settings**: https://huggingface.co/settings/mcp
2. Add this Space under **Spaces Tools** (look for the MCP badge on the Space).
3. Restart your MCP client (VS Code, Cursor, Claude Code, etc.).
4. The tools from this Space will appear as MCP tools and can be called directly.

### Manual config (generic MCP client using mcp-remote)

If your MCP client uses a JSON config, you can point it to the SSE endpoint via `mcp-remote`:

```jsonc
{
  "mcpServers": {
    "credentialwatch": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://<space-host>/gradio_api/mcp/sse"
      ]
    }
  }
}
```

Replace `<space-host>` with the full URL of your Space.

## Local development

```bash
# 1. Install deps
uv sync
# or
pip install -r requirements.txt

# 2. Run locally
uv run python app.py
```

The local server will be available at http://127.0.0.1:7860, and MCP at http://127.0.0.1:7860/gradio_api/mcp/sse.

## Deploying to Hugging Face Spaces

1. Create a new Space with SDK = **Gradio**.
2. Push this repo to the Space (Git or `huggingface_hub`).
3. Ensure the YAML header in `README.md` is present and correct.
4. Wait for the Space to build and start — it should show an **MCP badge** automatically.

## Troubleshooting

- **Configuration error**: Verify `sdk`, `app_file`, and `python_version` in the YAML header. The header must be the first thing in the file (no blank lines before `---`).
- **MCP badge missing**: Check that your app calls `demo.launch(mcp_server=True)` and confirm the Space is public.
- **LFS issues**: Ensure `README.md` is NOT tracked via Git LFS.

---

## 🎯 Project Goal

CredentialWatch transforms messy, decentralized provider data (state licenses, board certifications, DEA numbers) into:
1.  **A unified, queryable source of truth.**
2.  **A proactive alerting system** for at-risk credentials.

The system is designed to solve the real-world problem of missed credential expiries leading to compliance issues, denied claims, and scheduling conflicts.

## 🧩 Architecture

The system follows a microservice-like architecture with strict separation of concerns, orchestrated by a LangGraph agent.

### Components

1.  **Agent UI (Gradio + LangGraph)**: The user interface where users interact with the agent (chat or sweep triggers).
2.  **Three MCP Servers**:
    *   **`npi_mcp`**: Read-only access to the public NPPES NPI Registry.
    *   **`cred_db_mcp`**: (Hosted in this repo) Internal provider & credential database operations.
    *   **`alert_mcp`**: Alert logging and resolution management.
3.  **Modal Backend**: Hosting FastAPI microservices and the SQLite database (`credentialwatch.db`).

### Data Flow

```
User <-> Gradio UI <-> LangGraph Agent
                            |
           -----------------------------------
           |                |                |
      [npi_mcp]      [cred_db_mcp]     [alert_mcp]
           |                |                |
      (NPI_API)        (CRED_API)       (ALERT_API)
           |                |                |
        NPPES         [SQLite DB]      [SQLite DB]
```

## 📂 Repository Contents: `cred_db_mcp_server`

This repository currently hosts the **Credential Database MCP Server** (`cred_db_mcp`). This component provides the tools necessary for the agent to read from and write to the internal provider/credential database.

### Exposed Tools

The server exposes the following MCP tools (via Gradio's MCP support):

*   **`sync_provider_from_npi(npi)`**:
    *   Syncs a provider's data from the NPI registry (via backend) to the local database.
    *   *Usage*: Onboarding new providers.
*   **`add_or_update_credential(provider_id, type, issuer, number, expiry_date)`**:
    *   Upserts a credential record for a provider.
    *   *Usage*: Keeping license data current.
*   **`list_expiring_credentials(window_days, dept?, location?)`**:
    *   Returns a list of credentials expiring within the specified window (e.g., 90 days).
    *   *Usage*: Proactive monitoring and sweeps.
*   **`get_provider_snapshot(provider_id?, npi?)`**:
    *   Returns provider info + all credentials + alerts.
    *   *Usage*: Context retrieval for user queries.

## 🧪 Testing

Run the unit tests using `pytest`:

```bash
uv run pytest
```

## 🛠 Tech Stack

*   **Python 3.11**
*   **Gradio 5+** (Frontend & MCP Server)
*   **FastAPI / HTTPX** (Networking)
*   **Pydantic** (Data validation)
*   **uv** (Package management)

---
*Built for the Hugging Face MCP 1st Birthday Hackathon.*