jcs-mcp
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., "@jcs-mcpShow me 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.
jcs-mcp
An MCP server that exposes the Joaquim Chaves Saúde (JCS) patient portal (webapp.jcs.pt) as tools for Claude and other MCP clients.
It lets you ask Claude things like:
"Show me my upcoming appointments"
"What prescriptions do I have active?"
"Download my latest exam result and summarise it"
"List my invoices from the past 6 months"
Features
11 MCP tools covering the full JCS portal:
Tool | Description |
| Authenticate; session saved to |
| Name, email, patient ID |
| Main health feed — exam results, appointment confirmations, documents |
| Notifications and messages |
| Full message detail; body contains signed document URIs |
| Upcoming and recent appointments from the calendar |
| Active (and optionally expired) prescriptions |
| Invoices (Faturas/Recibos) from the patient profile |
| Fetch HTML exam result content from a signed URI |
| Download a PDF document, saved to |
| Parse a prescription PDF with a local Ollama model |
Session management
Authentication uses OAuth2 Resource Owner Password Grant against the GatewayBox platform. After the first jcs_login() call the session is persisted to ~/.jcs_session.json and reloaded automatically on subsequent calls. If JCS_PASSWORD is set in .env, the server will auto-login when the session expires — no manual intervention needed.
Prescription parsing
parse_prescription extracts structured data from a downloaded prescription PDF using a local Ollama model:
{
"patient": "...",
"date": "YYYY-MM-DD",
"doctor": "...",
"specialty": "...",
"medications": [
{
"name": "...", "dci": "...", "strength": "...",
"form": "...", "quantity": "...", "posology": "...", "duration": "..."
}
],
"prescription_number": "...",
"notes": "..."
}For image-based PDFs it falls back to vision mode automatically (use a vision-capable model like llava).
Related MCP server: Proton-MCP
Requirements
Python 3.10+
A JCS account at webapp.jcs.pt
Your device UUID and device token key (see Auth setup below)
Ollama (optional, only needed for
parse_prescription)
Installation
git clone https://github.com/nathanfolkman/jcs-mcp.git
cd jcs-mcp
uv syncConfiguration
Copy .env.example to .env and fill in your credentials:
cp .env.example .env# Required
JCS_PHONE_NUMBER=+351912345678
# Optional — if set, the server will auto-login when the session expires
JCS_PASSWORD=your_password
# Required for first login (see Auth setup below)
JCS_DEVICE_UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
JCS_DEVICE_DTK=your_device_token_key
# Optional — where to save downloaded documents (default: ./downloads)
OUTPUT_DIR=./downloadsAuth setup
The JCS API uses a GatewayBox device registration system. Your script must present a device UUID and device token key (dtk) that are already registered with the server — unrecognised devices are rejected.
The easiest way to obtain these is from your browser session on webapp.jcs.pt:
Open Chrome DevTools → Application → Local Storage →
https://webapp.jcs.ptFind the key that contains your
appUuid— this is yourJCS_DEVICE_UUIDOpen DevTools → Network, log in normally, and look for the
POST /api/device/tokenresponse — thedeviceTokenfield is yourJCS_DEVICE_DTK
Set both values in .env. After the first successful jcs_login() call they are also persisted to ~/.jcs_session.json.
Usage
With Claude Code
Add to your MCP settings (e.g. ~/.claude.json):
{
"mcpServers": {
"jcs-health": {
"command": "uv",
"args": ["run", "--directory", "/path/to/jcs-mcp", "python", "mcp_server.py"]
}
}
}MCP Inspector (development)
uv run mcp dev mcp_server.pyStandalone
uv run python mcp_server.pyFirst-time login
If JCS_PASSWORD is not set in .env, call the login tool explicitly once:
jcs_login(password="your_password")The session is saved and reused automatically until it expires (~24 hours).
Project structure
jcs-mcp/
├── jcs_client.py # Async HTTP client (GatewayBox OAuth2 + all API methods)
├── mcp_server.py # FastMCP server — 11 tools
├── pyproject.toml # Dependencies
└── .env # Credentials (not committed)API notes
The JCS webapp is a single-page application built on the GatewayBox platform by Seamlink. All API endpoints were reverse-engineered from network traffic. Key facts:
Base URL:
https://webapp.jcs.ptAuth: OAuth2 password grant via
POST /Tokenwithuid,AppUuid, anddtkcustom headersAll data endpoints use
POSTwith a JSON body containingdevice(the appUuid)Document URIs are signed, time-limited tokens embedded in message body HTML as
data-attach-htmlattributesHTML exam results:
GET /api/attachdata/getcontent?uri=...PDF documents:
GET /api/attachdata/getfile?uri=...
License
MIT
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/jcs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server