Uphealth Signal MCP server
The adaptive health-messaging engine for apps and agents — federally-sourced, audience-safe. Not medical advice.
The Uphealth MCP server lets any Model Context Protocol client — Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, or your own agent — look up federal health facts and drive a cued health-message stream as five tools (one needs no key). It wraps the Signal API; the model never sees your raw HTTP layer.
Try it with zero setup: lookup_health_fact needs no key — one already-public federal fact per question. For the adaptive stream, get a free sandbox key (no credit card, no PHI, no BAA) at https://uphealth.us/signup, then pick an install method below.
The five tools
lookup_health_fact | GET /v1/public/health-fact | none | One already-public federal fact for a question/topic + its source + an uphealth.me link |
create_patient_stream | POST /v1/signal/streams | up_… | Start a stream from a template; returns the opening cue |
get_next_cued_message | POST /v1/signal/streams/:id/cue | up_… | Submit the patient's response, get the next message |
read_stream_state | GET /v1/signal/streams/:id | up_… | Read state + current cue without advancing |
list_sandbox_topics | GET /v1/signal/sandbox-topics | up_… | List the five sandbox topics |
The one rule (keyed tools): every cue after the first requires feedback on the prior one (the model passes the patient's response_action). The tool descriptions teach this, so a capable agent drives the loop correctly.
Option A — Local (stdio via npx) · recommended
No hosting, no URL. The client launches the server as a subprocess with your key in its environment.
Claude Desktop
claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"uphealth": {
"command": "npx",
"args": ["-y", "@uphealth/mcp-server"],
"env": { "UPHEALTH_API_KEY": "up_sandbox_YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json (or a project's .cursor/mcp.json):
{
"mcpServers": {
"uphealth": {
"command": "npx",
"args": ["-y", "@uphealth/mcp-server"],
"env": { "UPHEALTH_API_KEY": "up_sandbox_YOUR_KEY" }
}
}
}
VS Code (Copilot agent mode)
.vscode/mcp.json:
{
"servers": {
"uphealth": {
"command": "npx",
"args": ["-y", "@uphealth/mcp-server"],
"env": { "UPHEALTH_API_KEY": "up_sandbox_YOUR_KEY" }
}
}
}
Claude Code (CLI)
claude mcp add uphealth --env UPHEALTH_API_KEY=up_sandbox_YOUR_KEY -- npx -y @uphealth/mcp-server
Any other stdio MCP client uses the same shape: command npx, args ["-y", "@uphealth/mcp-server"], env UPHEALTH_API_KEY.
Option B — Remote (hosted Streamable HTTP)
The server is also hosted at https://mcp.uphealth.us/mcp. Clients with native remote-MCP support add it directly with an Authorization: Bearer header. For clients that only speak stdio, bridge with mcp-remote:
{
"mcpServers": {
"uphealth": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://mcp.uphealth.us/mcp",
"--header", "Authorization: Bearer up_sandbox_YOUR_KEY"
]
}
}
}
Verify
Use the MCP Inspector against either transport:
UPHEALTH_API_KEY=up_sandbox_YOUR_KEY npx @modelcontextprotocol/inspector npx -y @uphealth/mcp-server
npx @modelcontextprotocol/inspector --transport streamable-http \
--url https://mcp.uphealth.us/mcp \
--header "Authorization: Bearer up_sandbox_YOUR_KEY"
Then call create_patient_stream with template_id: "general_wellness_daily", and get_next_cued_message with a response_action (e.g. did_it).
Where it's published
The npm package page shows the current version; third-party catalogs re-scan on their own schedule, so their displayed version can lag a release or two behind npm and the official registry.
Notes
- Keep your key private. Treat
UPHEALTH_API_KEY like any secret; don't commit client configs containing a live key.
- Display mode only in the sandbox — no PHI, no BAA. Deliver mode is BAA-gated at the PMPM tier.
- Discovery quota: 50 cues / calendar month. Over the cap, tools return the
over_quota result with an upgrade link.
Links