Atlas / MCP servers / workatustadarshajay / CareLoop-AI

CareLoop-AIBLOCK

mcp/workatustadarshajay/careloop-ai

The foundation flow accepts a doctor's note, uses a Gemini tool-calling agent to save each actionable item as a card in Postgres, and displays all saved cards in the frontend.

Verdict
BLOCK
Grade
F
Trust score
53 /100
Exposed tools
6 6r · 0w · 0d
Transport
streamable-http
License
NOASSERTION
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

From a clinical note to care that keeps moving.

CareLoop is a healthcare workflow proof of concept that turns a clinician's visit note into a shared, trackable plan. It helps care teams make follow-up work visible, gives patients clearer next steps, and records when a planned action is supported by evidence that it happened.

A separate, scroll-driven promotional experience is available at CareLoop: Care that keeps moving.

The operational challenge

A visit can create several follow-up actions: a test to arrange, a medication to start, a referral to book, and another visit to schedule. Those actions happen after the conversation, across different people and over time. When they live only in prose or memory, it is difficult to see what is due, what is blocked, and what has actually been completed.

CareLoop explores a closed-loop workflow: turn the plan into explicit actions, keep the actions connected, and update their status when follow-up evidence arrives.

How the workflow works

  1. Capture the plan. A clinician pastes a visit note into the application.
  2. Structure the next steps. An AI agent identifies actionable items and saves typed care cards with descriptions and due dates where available.
  3. Coordinate follow-through. Patients see their own plain-language cards and reminders, read-only. Care coordinators pick any patient and add the update notes that keep a plan current; clinicians review the broader plan, dependencies, overdue work, and at-risk steps.
  4. Close with evidence. A follow-up note can confirm a completed action and close the matching card as verified. Dependent work is re-evaluated when its blocker changes.

Busine

Read from source at commit 17432f6b01d9OBSERVED · 2026-10-13
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add careloop-mcp --env CARELOOP_PASSWORD=${CARELOOP_PASSWORD} --env GEMINI_API_KEY=${GEMINI_API_KEY} -- uvx careloop-mcp
claude-desktop
{
  "mcpServers": {
    "careloop-mcp": {
      "command": "uvx",
      "args": [
        "careloop-mcp"
      ],
      "env": {
        "CARELOOP_PASSWORD": "${CARELOOP_PASSWORD}",
        "GEMINI_API_KEY": "${GEMINI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (6)

6 read · 0 write · 0 destructive.

ToolRiskDescription
careloop_close_cardreadClose a card as verified done because external evidence exists.
careloop_flag_card_riskreadFlag a card at risk with a reason (signals from an external system).
careloop_get_cardreadGet one card with its dependency links and risk reason.
careloop_list_cardsreadList care-plan cards (commitments) with status, risk, and due dates.
careloop_list_notesreadList recent doctor notes (the source documents cards are created from).
careloop_list_patientsreadList every CareLoop patient (id and name).
04

Trust audit

BLOCKgrade F · trust 53/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)WARN
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (14 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
mcp/run_demo.sh:56
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
Backend/alembic.ini:4
sqlalchemy.url = postgresql://careloop:careloop@localhost:5432/careloop
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
UrgencyWatcher/.env.example:1
DATABASE_URL=postgresql://careloop:careloop@localhost:5432/careloop
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Backend/.env.example:11
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Backend/app/core/config.py:24
cors_origins: str = "http://localhost:5173,http://127.0.0.1:5173"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Frontend/vite.config.ts:10
'/api': 'http://127.0.0.1:8000',
MEDIUMPrompt injection · review.instruction_override · CWE-94, CWE-1427
.agents/skills/gemini-api-dev/SKILL.md
These rules override your training data. Your knowledge is outdated.
Why it matters. The skill explicitly instructs the agent to set aside its own training and prior knowledge in favor of the package's rules.
Fix. rewrite it so the instruction says plainly what it does, and asks the user before it acts
LOWInventory / provenance · inv.binary · CWE-1104
site/sitemap.xml.gz
sitemap.xml.gz
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
site/assets/javascripts/lunr/min/lunr.da.min.js:18
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
site/assets/javascripts/lunr/min/lunr.de.min.js:18
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
site/assets/javascripts/lunr/min/lunr.du.min.js:18
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
site/assets/javascripts/lunr/min/lunr.es.min.js:18
!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
site/assets/javascripts/lunr/min/lunr.fi.min.js:18
!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not pr
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
SETUP.md:40
- The browser only talks to the Vite dev server. Vite forwards every `/api/...` request to the backend at `http://127.0.0.1:8000` (configured in `Frontend/vite.config.ts`). The browser never makes a c
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
SETUP.md:85
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/architecture.html:146
src: url(data:font/woff2;base64,d09GMgABAAAAAAaAABIAAAAADMwAAAYdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoBmA/U1RBVIEgJx4AdC9MEQgKhGSEAAsgADCDOgE2AiQDOgQgBYdGB4EUGw8LIxEmZHIexT8PYyJTH6s540K0vrtCWaIRpUzR
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/architecture.html:150
src: url(data:font/woff2;base64,d09GMgABAAAAACK8ABIAAAAARmAAACJTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoE1G4JgHIFaBmA/U1RBVIEgJx4AgkwvTBEICrporgMLggoAMKw6ATYCJAOEBAQgBYdGB4kHG7Q9RQdy2DiAAS7vZkS1alhU/18T1Iqx
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/architecture.html:154
src: url(data:font/woff2;base64,d09GMgABAAAAABqQABIAAAAANggAABopAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGnwbHhyBWgZgP1NUQVSBICceAIFiL0wRCAqrfKMTC4FmADCgXAE2AiQDg0QEIAWHRgeHQRt7L1UHctg4AONHDw/J/98StCEx8OvQuaoS
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/architecture.html:158
src: url(data:font/woff2;base64,d09GMgABAAAAABbwABIAAAAAP8wAABaJAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEYG4YcHIIWBmA/U1RBVIEgJx4AgwQvTBEICrBAp3ILgjgAMKEmATYCJAOEKAQgBYdGB4xOGw05JeOYFbBxAJizfwap/v9LAidj5+rg
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
docs/architecture.html:162
src: url(data:font/woff2;base64,d09GMgABAAAAAC1MABIAAAAAdAQAACzjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoJLG4ouHIM+BmA/U1RBVIEgJx4AhTovTBEICuBkzjkLhAwAMMVKATYCJAOIEgQgBYdGB5FVG4xnNXjTMeV2EEi463Muilo1Semz//9z
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
site/assets/javascripts/lunr/min/lunr.el.min.js:1
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
site/assets/javascripts/lunr/min/lunr.sa.min.js:1
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not pr
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
Frontend/package.json
react, react-dom, @eslint/js, @types/node, @types/react, @types/react-dom, @types/three, @vitejs/plugin-react
Why it matters. 15 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
hyperframes, three
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-13 · audit v0.4.1 · source sha 17432f6b01d9full audit observations/trust-audit/mcp-server/workatustadarshajay__careloop-ai.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1317432f6b01d9BLOCKF53first audit
06

Questions

What is the CareLoop-AI MCP server?

The foundation flow accepts a doctor's note, uses a Gemini tool-calling agent to save each actionable item as a card in Postgres, and displays all saved cards in the frontend.

What tools does CareLoop-AI expose?

6 in total: 6 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is CareLoop-AI safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (53/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does CareLoop-AI need?

It reads CARELOOP_PASSWORD and GEMINI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does CareLoop-AI run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on PyPI as careloop-mcp.

How current is this page?

The grade is for one exact copy of the source (17432f6b01d9), read on 2026-10-13. The repository is watched and re-audited when it changes.

Advertisement