CUF Health Portal MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@CUF Health Portal MCP Servershow my upcoming appointments"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CUF Health Portal MCP Server
An MCP (Model Context Protocol) server that exposes the CUF health portal as tools for Claude and other MCP clients.
Tools
Tool | Description |
| Patient profile (name, contacts, NIF, SNS number) |
| Upcoming appointments |
| Full appointment history |
| Imaging reports, lab reports, clinical files, etc. |
| Download a clinical document PDF by ID |
| Active lab/exam results from the portal |
| All invoices |
| Download an invoice PDF by payment number |
| Exam prescriptions (scrapes www.cuf.pt) |
| Download a prescription PDF by download URL |
Downloaded PDFs are saved to ./downloads/cuf/ by default (configurable via OUTPUT_DIR env var).
Related MCP server: MCP NIF.PT
Setup
Requirements
A CUF portal account (saudecuf.pt)
Install
git clone <repo>
cd cuf-mcp
uv syncConfigure credentials
Create a .env file:
CUF_USERNAME=your.email@example.com
CUF_PASSWORD=yourpassword
OUTPUT_DIR=./downloads # optionalRegister with Claude Code
Add to ~/.claude/claude_desktop_config.json (or your MCP settings):
{
"mcpServers": {
"cuf-health": {
"command": "uv",
"args": ["run", "--directory", "/path/to/cuf-mcp", "python", "mcp_server.py"]
}
}
}Then run /mcp in Claude Code to connect.
Run standalone (MCP Inspector)
uv run mcp dev mcp_server.pyBulk download all records
uv run python download_cuf.pyDownloads all clinical documents and invoices to ./downloads/cuf/.
Architecture
Authentication
The portal uses two separate auth systems:
saudecuf.ptGraphQL API — JWT bearer token obtained viaauthenticationMutation. The JWT containspatientId,usercode, andinternalPatientCode. Headers requirex-channel-type-id: 1and a per-requestx-transaction-idUUID.cuf.ptDrupal (prescriptions only) — Separate Drupal session cookie (SSESS*) obtained by POSTing tohttps://www.cuf.pt/mycuf/login. Prescriptions are server-rendered HTML, not available via GraphQL.
Key files
mcp_server.py— FastMCP server; defines all 10 tools; lazy-initializes a shared authenticatedCufClientcuf_client.py— AsyncCufClientclass; wraps all GraphQL queries and the prescription scraperdownload_cuf.py— Standalone bulk downloader script
WAF note
The portal runs behind a Barracuda WAF that blocks headless Chromium. Plain httpx with browser-like headers works fine.
Notes
list_exam_resultscurrently returns an empty list — thegetActiveExamResultsGraphQL endpoint requires a separate auth scope not present in the standard JWT.Prescriptions use
internalPatientCodeas the client identifier, notpatientId.Invoice
paymentNumberformat:"CCF2026/45291"→docSeries="CCF2026",docNumber="45291".
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nathanfolkman/cuf-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server