Spaces:
Sleeping
A newer version of the Gradio SDK is available:
6.5.1
title: CredentialWatch
emoji: 🛡️
colorFrom: blue
colorTo: green
sdk: gradio
sdk_version: 6.0.1
app_file: app.py
pinned: false
python_version: 3.11
CredentialWatch 🛡️
CredentialWatch is a demo product for the "MCP 1st Birthday / Gradio Agents Hackathon" (Hugging Face).
0. What I’m building (TL;DR)
- Domain: US-style healthcare admin / provider credentialing & expiries (state licenses, board certs, DEA/CDS, malpractice, hospital privileges, etc.).
- Goal: Show how Model Context Protocol (MCP) + LangGraph agents + Gradio + Modal + SQLite can turn messy, fragmented credential data into:
- One unified, queryable view of each provider, and
- A proactive alerting system for expiring / at-risk credentials.
- Constraint: Use only open / public tools & APIs (no closed vendor APIs, no real PHI).
1. Problem & motivation
Real-world (simplified):
- Provider groups (clinics, hospitals, multi-specialty practices) have dozens of contracts with different health plans and institutions.
- Multiple credentials can expire or go stale:
- State licenses, board certifications, DEA/CDS numbers,
- Malpractice insurance,
- Hospital privileges, etc.
- Today:
- Each health plan / hospital sends its own emails / portal tasks asking to update credentials and directory data.
- Staff maintain local spreadsheets, trackers, email threads, often with inconsistent formats.
- It’s easy to miss an expiry, leading to:
- Compliance issues,
- Denied claims (revenue loss),
- Inability to schedule or bill a provider after a certain date.
CredentialWatch acts as a central radar:
“For all my providers, tell me what’s expiring when, what’s high risk, and log alerts we can action.”
2. Solution concept
CredentialWatch provides:
- A single, internal “source-of-truth” SQLite DB for providers, credentials and alerts.
- Three separate MCP servers (strict separation of concerns, each can be its own HF Space/repo):
npi_mcp→ read-only public provider info from NPPES NPI Registry API.cred_db_mcp→ internal provider & credential DB operations.alert_mcp→ alert logging, listing & resolution.
- A LangGraph-based agent that:
- Periodically runs an expiry sweep and logs alerts.
- Answers free-text questions like:
- “Who has credentials expiring in the next 60 days in Cardiology?”
- “Show me the credential snapshot for Dr. Jane Doe.”
- A Gradio UI where:
- Judges/users chat with the agent,
- They can click a “Run Nightly Sweep” button,
- They see tables for “expiring soon” and an Alert Inbox.
3. Hackathon & design constraints
- Event: Hugging Face – MCP 1st Birthday / Gradio Agents Hackathon.
- Judging goals:
- Strong MCP usage (tools/resources as first-class interfaces).
- Agentic sophistication: planning, multi-step tool use, long-running flows.
- Clear UX/Teachability.
Constraints & safety:
- Only public / open APIs (NPPES NPI Registry, OpenAI GPT).
- No real PHI: use synthetic/internal IDs + public NPI data.
- Safety boundaries:
- Read-only to external systems.
- Writes only to internal SQLite DB.
4. Tech stack 🧱
- Language: Python 3.11
- Package management:
uv - Frontend / UI: Gradio 6 (Hosted as a Hugging Face Space)
- Agents: LangGraph (Python)
- LLM: OpenAI
gpt-5.1(orgpt-4o) - Tool protocol: Model Context Protocol (MCP), via SSE.
- Backend web framework: FastAPI, running on Modal.
- Database: SQLite, persisted on a Modal volume.
- ORM: SQLAlchemy 2.x.
5. Architecture overview 🧩
Logical components
HF Space #1 – Agent UI (credentialwatch-agent-ui)
- Gradio frontend.
- LangGraph agent runtime (
expiry_sweep_graph,interactive_query_graph). - MCP client configured for 3 remote MCP servers (via SSE).
HF Space #2 – npi_mcp
- MCP server for NPI/NPPES tools (
search_providers,get_provider_by_npi). - Calls
NPI_APIFastAPI service on Modal.
HF Space #3 – cred_db_mcp
- MCP server for internal data tools (
sync_provider_from_npi,add_or_update_credential, etc.). - Calls
CRED_APIFastAPI service on Modal.
HF Space #4 – alert_mcp
- MCP server for alert tools (
log_alert,get_open_alerts, etc.). - Calls
ALERT_APIFastAPI service on Modal.
Modal backend
- FastAPI microservices:
NPI_API,CRED_API,ALERT_API. - Shared SQLite DB on a Modal volume.
6. The 3 MCP servers – separation of concerns 🧱
6.1 npi_mcp
Read-only access to public provider data.
search_providers(query, state?, taxonomy?)get_provider_by_npi(npi)
6.2 cred_db_mcp
Interface to internal provider & credential data.
sync_provider_from_npi(npi)add_or_update_credential(...)list_expiring_credentials(...)get_provider_snapshot(...)
6.3 alert_mcp
Manage alerts generated by the agent.
log_alert(...)get_open_alerts(...)mark_alert_resolved(...)
7. Agent behaviors (LangGraph) 🧠
7.1 expiry_sweep_graph
Batch / nightly graph.
- Call
cred_db_mcp.list_expiring_credentials. - Decide severity.
- Call
alert_mcp.log_alert.
7.2 interactive_query_graph
Chat / Q&A graph (ReAct-style).
- Plans tool calls (NPI, DB, Alerts).
- Summarizes results.
8. Database model 🗄️
DB engine: SQLite on Modal volume.
providers: Internal provider records.credentials: Licenses, certifications, etc.alerts: Generated alerts for expiries.
How to Run Locally
To run the CredentialWatch Agent UI locally:
Prerequisites:
- Python 3.11+
uvpackage manager
Environment Variables: Create a
.envfile or set the following environment variables:OPENAI_API_KEY=sk-... # URLs for your deployed MCP servers (or local if running locally) NPI_MCP_URL=https://<your-npi-space>.hf.space/sse CRED_DB_MCP_URL=https://<your-cred-db-space>.hf.space/sse ALERT_MCP_URL=https://<your-alert-space>.hf.space/sseRun the Agent:
uv run -m credentialwatch_agent.mainThis will start the Gradio interface locally at
http://localhost:7860.