{
  "source_file": "0930",
  "source_platform": "Hashnode",
  "author": "Lakshmi Mahabaleshwara",
  "title_listed": "How to Build a Privacy-First Medical Image De-Identification Agent with Claude and MCP",
  "keywords": "",
  "domain": "图像处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://freecodecamp.org/news/build-a-privacy-first-medical-image-de-identification-agent",
  "publish_date": "2026-08-06",
  "corpus_stage": "",
  "notes": "",
  "id": "931544a971ef",
  "collected_at": "2026-10-02T14:11:46",
  "title": "How to Build a Privacy-First Medical Image De-Identification Agent with Claude and MCP",
  "body_markdown": "Imagine asking an AI assistant to de-identify thousands of medical images. It runs the pipeline, tracks progress, summarizes every decision, and tells you which files need human review, all without ever seeing a single pixel of patient data.\nThat sounds impossible at first. AI assistants typically need access to the data they are helping you process.\nIn this tutorial, you'll build an AI agent that doesn’t inspect sensitive medical images. Instead, it orchestrates a local de-identification pipeline through carefully designed tools, keeping the patient data entirely on your machine.\nThe technology that makes this possible is the Model Context Protocol (MCP), an open standard that lets AI models call external tools instead of relying only on their built-in capabilities.\nIn my previous article,\nHow to Build an AI-Powered Medical Image De-Identification Pipeline for Clinical Research\n, we already saw how to build the de-identification tool -\nAegis\n, an open-source tool built using a MONAI (PyTorch) pipeline that removes PHI from both DICOM metadata and image pixels using OCR and NER.\nI have since extended it with local MCP (Model Context Protocol) server support, and in this article we'll build that server from scratch with FastMCP. Then we'll connect it to Claude Desktop, turning Claude into an AI agent that can run, monitor, and audit de-identification jobs through natural conversation.\nOne note before we start: while Aegis is the example throughout, the pattern in this tutorial applies to any Python tool you want to give an AI agent access to. If you have your own pipeline, CLI, or library, you can follow along and wrap that instead.\nTable of Contents\nWhat You'll Build\nPrerequisites\nWhat Aegis Does\nHow to Set Up Aegis\nWhat Is MCP, and Why Use It?\nHow the Architecture Works\nStep 1: Design the Tool Surface\nStep 2: Build the MCP Server with FastMCP\nStep 3: Test with MCP Inspector — Before Any AI Is Involved\nStep 4: Connect Claude Desktop\nStep 5: Talk to Your Agent\nVerification\nDoes the AI Ever See Patient Data?\nSecurity Considerations\nA Note on the Word \"De-identification\"\nWhere This Fits, and What's Next\nConclusion\nReferences\nWhat You'll Build\nBy the end of this tutorial, you'll have:\nA local MCP server that exposes the Aegis de-identification pipeline as six tools.\nClaude Desktop connected to that server, with human-in-the-loop approval for each action.\nAn agent you can talk to in plain English:\n\"De-identify this folder and tell me if anything needs manual review.\"\nA verifiable audit trail on disk that you can check against everything the agent reports.\nPrerequisites\nTo follow this tutorial, you should have:\nIntermediate Python experience\nThe Aegis repository (or your own Python tool to wrap):\nhttps://github.com/lakshmi-mahabaleshwara/aegis\nPython 3.10 or later\nClaude Desktop installed (macOS or Windows); a free Claude account works for local MCP servers\nNode.js (only used for a testing tool, not for the server itself)\nWe'll use:\nThe MCP Python SDK (\nmcp\n)\nFastMCP (included in the SDK)\nMCP Inspector for testing\nClaude Desktop as the MCP host\nIf you haven't read the previous article, you don't need to rebuild the pipeline from scratch. Cloning the Aegis repository is enough, but the earlier article explains what the pipeline is actually doing under the hood.\nWhat Aegis Does\nAegis is a medical image de-identification pipeline that removes PHI from DICOM metadata and image pixels, records every action in audit reports, and routes uncertain cases for manual review.\nHow to Set Up Aegis\nBefore we build the server, get Aegis installed. The server we write in the next step imports this package, so this has to be in place first.\n# Get the code\ngit clone https://github.com/lakshmi-mahabaleshwara/aegis.git\ncd aegis\n\n# Create and activate a virtual environment\npython3 -m venv venv\nsource venv/bin/activate\n# On Windows: venv\\Scripts\\activate\n\n# Install Aegis (editable) plus the MCP server in one step.\n# The [mcp] pulls in the MCP SDK; it also installs the\n# `aegis-mcp` console command you'll point Claude Desktop at.\npip install -e \".[mcp]\"\n\n# One-time: download the OCR and NER model weights\npython scripts/prefetch_models.py\nThe editable install (\npip install -e\n) makes the\nmonai_aegis\npackage importable from any directory and puts the\naegis-mcp\nconsole command on your PATH (inside the venv). The MCP server depends on this, because Claude Desktop launches it from its own working directory, not from the repository root.\nWith the package installed, we can start building the server that exposes it.\nWhat Is MCP, and Why Use It?\nThe Model Context Protocol (MCP) is an open standard that lets AI applications call external tools. Instead of trying to solve everything from the information already in its context, an AI model can invoke functions exposed by an external program.\nThree roles are involved:\nHost – the AI application (Claude Desktop in our case)\nServer – a small program you write that exposes tools\nTools – Python functions with names, parameters, and descriptions that the AI can call\nWhen Claude Desktop starts, it launches your MCP server and discovers the tools it exposes. It sees only each tool’s name, parameter schema, and docstring, not your implementation code. In practice,\nyour docstrings become the prompt\nthat helps Claude decide when to call a tool.\nWhy use MCP at all?\nIf you’re comfortable with Python, you could call the Aegis library directly from your own scripts. MCP becomes valuable when you want an AI assistant to operate that pipeline through natural conversation. Instead of writing scripts or remembering command-line options, you can simply ask:\n“De-identify this folder.”\n“Is the batch finished?”\n“Which files need manual review?”\n“Summarize today’s run.”\nThe underlying pipeline never changes. MCP simply provides a safe interface between the AI and your software, allowing the model to orchestrate the workflow while the actual processing remains in your local Python application.\nWe’ll use Claude Desktop as the host because it supports MCP natively. There are no bridges, extra services, or network ports to configure the server communicates with Claude Desktop over standard input/output as a local subprocess, and the entire setup is configured through a single JSON file.\nHow the Architecture Works\nClaude Desktop communicates with the MCP server, which invokes the Aegis pipeline locally. The pipeline processes the medical images on your machine, while only summaries such as counts, decisions, and file paths are returned to Claude.\nStep 1: Design the Tool Surface\nBefore writing code, decide what the agent can do. Our server exposes six tools:\nTool\nPurpose\nwarm_up\nPreload the OCR and NER models in Aegis so the first real call is fast\ndeidentify_file\nDe-identify a single DICOM/JPEG/PNG file using Aegis pipeline\nstart_batch_job\nDiscover and process all DICOM/image files in a directory, in the background\nget_job_status\nCheck the progress of a batch job initiated previously\nsummarize_run\nAudit a completed run from its report files\nlist_review_queue\nList files routed to manual human review\nWe designed these tools around three simple principles:\nReturn summaries instead of sensitive data.\nUse background jobs for long-running tasks.\nKeep the tool surface small and focused.\nStep 2: Build the MCP Server with FastMCP\nNow let’s turn that design into a working MCP server. We will build it one piece at a time so you can reuse the same pattern for your own Python tools. The complete implementation lives in\nsrc/monai_aegis/mcp_server.py\n; the sections below show how it comes together.\n1. The Server Instance\nFastMCP (bundled with the MCP Python SDK) turns a decorated Python function into a tool.\nfrom mcp.server.fastmcp import FastMCP\n\n# creates a FastMCP server instance\nmcp = FastMCP(\"aegis-mcp\")\nThe string\n\"aegis-mcp\"\nis just the server's name. It's what Claude Desktop shows in its tool list. Every tool we add from here is a function decorated with\n@mcp.tool()\n.\n2. Your First Tool\nA tool is a decorator, a typed signature, and a docstring. Here's the one that does the real work, de-identifying a single file:\n@mcp.tool()\ndef deidentify_file(input_path: str, output_dir: str = \"\") -> dict:\n    \"\"\"De-identify a single medical image (DICOM, JPEG, or PNG).\n\n    Scrubs DICOM header PHI and redacts burned-in pixel PHI using\n    OCR and NER. Returns summary statistics and the output location\n    only, never the redacted text or any pixel data.\n    \"\"\"\n    ...\n    return {\n        \"status\": \"success\",\n        \"source_file\": src.name,\n        \"output_dir\": str(out),\n        \"pixel_regions_detected\": len(pixel_rows),\n        \"pixel_decisions\": decisions,   # e.g. {\"redacted\": 4, \"safelisted\": 10}\n        \"header_tags_scrubbed\": tags_scrubbed,\n        \"needs_manual_review\": decisions.get(\"low_confidence\", 0) > 0,\n    }\nNotice that Claude only sees the docstring, while the tool returns summary statistics rather than image data or extracted text.\n3. Never Print to\nstdout\nDo not use\nprint()\nin an MCP server because\nstdout\nis reserved for JSON-RPC. Send logs to\nstderr\ninstead.\n4. Long Jobs Need the Async Pattern\nProcessing an entire directory can take several minutes, which is longer than an MCP tool call should block. Instead of waiting synchronously,\nstart_batch_job\ncreates a background thread, immediately returns a\njob_id\n, and lets Claude poll the progress using\nget_job_status()\n.\nimport threading, uuid\n\n_jobs = {}\n\n@mcp.tool()\ndef start_batch_job(input_dir: str, output_dir: str = \"\", mode: str = \"auto\") -> dict:\n    \"\"\"Start a background job that de-identifies all DICOM/image files\n    in a directory. Returns immediately with a job_id. Use get_job_status\n    to check progress, do not wait synchronously.\n    \"\"\"\n    job_id = uuid.uuid4().hex[:8]\n    _jobs[job_id] = {\"job_id\": job_id, \"state\": \"queued\",\n                     \"processed\": 0, \"total\": None,\n                     \"decisions\": {}, \"errors\": []}\n    threading.Thread(\n        target=_batch_worker, args=(job_id, input_dir, output_dir),\n        daemon=True,\n    ).start()\n    return {\"status\": \"started\", \"job_id\": job_id,\n            \"next_step\": f\"Call get_job_status with job_id '{job_id}'.\"}\nThe worker thread updates\n_jobs[job_id]\nas it processes each file, and the polling tool just reads it back:\n@mcp.tool()\ndef get_job_status(job_id: str) -> dict:\n    \"\"\"Return the current state, progress, and decision counts for a job.\"\"\"\n    return _jobs.get(job_id, {\"status\": \"unknown\", \"job_id\": job_id})\nSince the MCP server is a long-running process, it can keep the job registry in memory throughout the conversation. If the server restarts, active job IDs are lost, but the de-identified files and audit reports remain safely on disk.\n5. Heavy Models Need a Warm-Up\nAegis loads EasyOCR and a Stanford NER model, which takes time. The server builds the pipeline lazily and caches it, so it pays that cost once, and exposes a\nwarm_up\ntool so the first\nreal\ncall doesn't run into a timeout while models load:\n@mcp.tool()\ndef warm_up() -> dict:\n    \"\"\"Preload the OCR and NER models so the first real call is fast.\"\"\"\n    _get_pipeline()   # builds and caches the pipeline on first use\n    return {\"status\": \"ready\"}\n6. The Audit Tools Read the Records, Not the Images\nThe remaining tools read the reports and review folders that Aegis already produces. Because they summarize existing audit records rather than reprocessing images, Claude can answer questions about completed runs without accessing the underlying medical images.\n@mcp.tool()\ndef summarize_run(run_dir: str) -> dict:\n    \"\"\"Audit a run from its CSV reports. Returns counts only — never text or tag values.\"\"\"\n    run = Path(run_dir).expanduser().resolve()\n    pixels = _read_csv_rows(run / \"aegis_pixel_detections.csv\")\n    tags = _read_csv_rows(run / \"aegis_tag_actions.csv\")\n    return {\n        \"pixel_decisions\": Counter(r[\"decision\"] for r in pixels),  # redacted / safelisted / low_confidence\n        \"tag_actions\": Counter(r[\"action\"] for r in tags),          # REMOVE / REMAP / ZERO / DUMMY / ATTEST\n@mcp.tool()\ndef list_review_queue() -> dict:\n    \"\"\"List files quarantined for manual review — names only, never contents.\"\"\"\n    names = sorted(f for _, _, fs in os.walk(REVIEW_DIR) for f in fs if not f.startswith(\".\"))\n    return {\"count\": len(names), \"files\": names[:50]}\nStep 3: Test with MCP Inspector — Before Any AI Is Involved\nIf you are skeptical about all of this (I was), this step is for you. MCP Inspector is a debug UI that connects to your server and lets\nyou\nclick the tools manually.\nnpx @modelcontextprotocol/inspector /<ABSOLUTE PATH>/aegis/venv/bin/aegis-mcp\nThe Inspector opens on the\nServers\nscreen with your\naegis-mcp\nserver listed. Click the toggle to connect, it turns green when the server is running.\nNext, open the\nTools\ntab. You’ll see the six tools exposed by your MCP server. Run\nwarm_up\nfirst, and watch the terminal where you started the Inspector to see the OCR and NER models load.\nNext, run\ndeidentify_file\nwith the path to a test image. The\nResults\npanel shows the tool’s JSON response, while\nMessages\nshows the request and response exchanged with the server.\nStep 4: Connect Claude Desktop\nOpen\nClaude Desktop\nand go to\nSettings → Developer → Edit Config\n. This opens (or creates) the MCP configuration file. On macOS it’s located at\n~/Library/Application Support/Claude/claude_desktop_config.json\n, and on Windows at\n%APPDATA%\\Claude\\claude_desktop_config.json\n.\nAdd the following\naegis\nentry under\nmcpServers\n:\n{\n  \"mcpServers\": {\n    \"aegis\": {\n      \"command\": \"/<PATH TO AEGIS>/aegis/venv/bin/aegis-mcp\",\n      \"args\": [],\n      \"env\": {\n        \"AEGIS_OUTPUT_DIR\": \"/<PATH TO AEGIS>/aegis/staging_output\",\n        \"AEGIS_REVIEW_DIR\": \"/<PATH TO AEGIS>/aegis/staging_not_processed\",\n        \"AEGIS_DEVICE\": \"mps\"\n      }\n    }\n  }\n}\nConfiguration for Claude Desktop to connect to the Aegis MCP server.\nA few things to check before saving:\nUse absolute paths for command,\nAEGIS_OUTPUT_DIR\n, and\nAEGIS_REVIEW_DIR\n.\nPoint command to the aegis-mcp executable inside your virtual environment so Claude uses the correct Python installation and dependencies.\nSet\nAEGIS_DEVICE\nto\nmps\nfor Apple Silicon,\ncpu\nfor Intel Macs or Linux, or\ncuda\nif you have an NVIDIA GPU.\nSave the file,\nfully quit and restart Claude Desktop\n(closing the window isn’t enough). In a new chat, open the\nSearch & Tools\nmenu, you should now see the\nAegis\nMCP server with its six available tools.\nStep 5: Talk to Your Agent\nTime for the first conversation. Send:\nWarm up the Aegis de-identification server.\nClaude will ask for permission before calling the tool. This prompt is a feature, every capability you have given the agent requires your explicit approval, and you can grant it per call or per tool.\nOnce approved, the models load and Claude reports back with the elapsed time.\nDe-identify a single file:\nDe-identify the file </test_ultrasound.dcm.>\nClaude calls\ndeidentify_file\nand answers with the counts: how many text regions were detected, how many were redacted versus safe listed as clinical text, how many DICOM tags were scrubbed, and whether anything needs review. It narrates all of this without ever having seen the image.\nNext, a batch:\nNow start a batch de-identification job for </test_ultrasound>\nThe tool returns instantly with a job ID, and the processing continues in the background. Ask about it a moment later:\nHow's that job going?\nClaude remembers the job ID across turns and polls\nget_job_status\n, reporting files processed, running decision counts, and any errors.\nOnce the job finishes, you can ask Claude to summarize the run, list files requiring manual review, or generate a report for your review meeting, all from the pipeline’s audit records.\nSummarize the completed run. Does anything need manual review?\nWhat exactly was done to test_ultrasound.dcm, which header tags were touched?\nDraft a short de-identification summary for this run, suitable for a review meeting. Include totals, the decision breakdown, and files pending human review.\nEverything in the below summary came from tool results, counts and decisions read from the pipeline's own records.\nVerification\nCompare Claude’s summary with the CSV reports and\njob_summary_<job_id>.json\n. The numbers should match, giving you a simple way to verify everything the agent reports.\nDoes the AI Ever See Patient Data?\nNo. The tools never return image pixels, OCR-extracted text, or DICOM tag values, so Claude cannot access the underlying PHI.\nFor example, if you ask:\nShow me the patient name detected in that file.\nClaude cannot answer because that information is never exposed by the MCP tools.\nHowever, conversation metadata does reach the model. File names, directory paths, counts, and tool outputs are processed by Claude just like any other chat. Keep these points in mind:\nAvoid PHI in file names.\nRename files if they contain patient names or identifiers.\nKeep error messages clean.\nDon’t include sensitive DICOM values in exceptions returned by your tools.\nUse synthetic data while developing.\nThis tutorial uses fake PHI. Before working with real patient data, follow your organization’s security and compliance requirements.\nSecurity Considerations\nIf you adapt this pattern for your own tools, consider these best practices:\nRestrict file access.\nLimit tools to approved directories instead of allowing any readable path.\nReview tool permissions.\nIt’s reasonable to always allow read-only tools like\nget_job_status\n, but keep approval prompts for tools that modify files.\nReturn structured results.\nPrefer counts and categories over raw text to reduce the chance of exposing sensitive information.\nPin model versions.\nUsing fixed OCR and NER model versions makes your pipeline more reproducible and predictable.\nA Note on the Word \"De-identification\"\nIn regulations such as HIPAA,\nde-identification\nhas a specific legal meaning with defined requirements. This tutorial shows how to build an AI agent interface for a de-identification pipeline, not how to certify regulatory compliance. The pipeline intentionally routes uncertain cases for human review, and any real-world deployment should be validated against your organization’s policies and applicable regulations.\nWhere This Fits, and What's Next\nMCP doesn’t change how well Aegis detects PHI, it changes\nhow people interact with it\n. Instead of using the command line, users can run jobs, review results, and ask questions in natural language.\nFor automated workflows such as nightly batch processing, the CLI is still the better choice. MCP is best for interactive, human-in-the-loop tasks, while the CLI remains ideal for scheduled jobs. In both cases, the files and audit reports on disk remain the source of truth.\nHere are a few directions you can explore next:\nRun everything locally.\nPair the same MCP server with Ollama and Open WebUI so both the pipeline and the AI model stay on your machine.\nStrengthen security\n. Restrict tools to approved directories before deploying in a shared environment.\nBuild dataset preparation workflows\n. Use the agent to de-identify data, summarize results, and prepare datasets for machine learning.\nAdd downstream analysis.\nRun vision models on the de-identified outputs instead of the original images.\nReuse the pattern elsewhere\n. The same architecture can orchestrate pipelines that remove sensitive information from legal documents, logs, financial records, or other confidential data.\nConclusion\nWe turned an existing Python pipeline into an AI-accessible tool using MCP. The key design principle is\nthe model orchestrates the workflow but never sees the sensitive data.\nThis pattern extends beyond medical imaging. Any pipeline that handles sensitive information: such as legal documents, financial records, or personal photos can expose safe, structured tools while keeping the underlying data private.\nYou can find the complete implementation in the\nAegis\nrepository:\nhttps://github.com/lakshmi-mahabaleshwara/aegis\n. If you found this tutorial useful,\nconsider starring the repository to help others discover it.\nReferences\nModel Context Protocol documentation\nMCP Python SDK\nGetting started with local MCP servers on Claude Desktop\nHow to Build an AI-Powered Medical Image De-Identification Pipeline for Clinical Research\nAegis on GitHub",
  "metadata": {
    "title": "How to Build a Privacy-First Medical Image De-Identification Agent with Claude and MCP",
    "description": "Imagine asking an AI assistant to de-identify thousands of medical images. It runs the pipeline, tracks progress, summarizes every decision, and tells you which files need human review, all without ev",
    "keywords": null,
    "author": null,
    "og:site_name": "freeCodeCamp.org",
    "og:type": "article",
    "og:title": "How to Build a Privacy-First Medical Image De-Identification Agent with Claude and MCP",
    "og:description": "Imagine asking an AI assistant to de-identify thousands of medical images. It runs the pipeline, tracks progress, summarizes every decision, and tells you which files need human review, all without ev",
    "og:url": "https://www.freecodecamp.org/news/build-a-privacy-first-medical-image-de-identification-agent/",
    "og:image": "https://cdn.hashnode.com/uploads/covers/5fc16e412cae9c5b190b6cdd/93b0e883-87c6-4e07-97ca-4024da3e45e3.png",
    "og:image:width": "1920",
    "og:image:height": "1080",
    "twitter:card": "summary_large_image",
    "twitter:title": "How to Build a Privacy-First Medical Image De-Identification Agent with Claude and MCP",
    "twitter:description": "Imagine asking an AI assistant to de-identify thousands of medical images. It runs the pipeline, tracks progress, summarizes every decision, and tells you which files need human review, all without ev",
    "twitter:url": "https://www.freecodecamp.org/news/build-a-privacy-first-medical-image-de-identification-agent/",
    "twitter:image": "https://cdn.hashnode.com/uploads/covers/5fc16e412cae9c5b190b6cdd/93b0e883-87c6-4e07-97ca-4024da3e45e3.png",
    "twitter:label1": "Written by",
    "twitter:data1": "Lakshmi Mahabaleshwara",
    "twitter:label2": "Filed under",
    "twitter:data2": "Healthcare AI, ai agents, Claude Desktop, mcp, Medical Imaging",
    "twitter:site": "@freecodecamp",
    "article:published_time": "2026-08-06T09:15:25.673Z",
    "article:modified_time": "2026-08-06T09:15:25.673Z",
    "article:tag": "Medical Imaging",
    "article:publisher": "https://www.facebook.com/freecodecamp"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/931544a971ef/code/body-000.txt",
      "chars": 501,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-001.txt",
      "chars": 103,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-002.txt",
      "chars": 712,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-003.txt",
      "chars": 783,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-004.txt",
      "chars": 200,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-005.txt",
      "chars": 207,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-006.txt",
      "chars": 544,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-007.txt",
      "chars": 275,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-008.txt",
      "chars": 78,
      "language": "text"
    },
    {
      "file": "attachments/931544a971ef/code/body-009.txt",
      "chars": 325,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/1dfe474b-d9a0-4256-9dd7-302beecef935.png",
      "bytes": 143692,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/003.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/1dfe474b-d9a0-4256-9dd7-302beecef935.png",
      "alt": "Architecture diagram showing Claude Desktop communicating with a local MCP server, which invokes the Aegis de-identification pipeline. Medical images are processed locally, and only summary results such as counts, decisions, and file paths are returned to the AI model.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/7e952989-9e3e-4f45-9a08-579821699963.png",
      "bytes": 55925,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/004.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/7e952989-9e3e-4f45-9a08-579821699963.png",
      "alt": "MCP Inspector showing the Aegis MCP server connected over STDIO, with the server status active and ready for testing.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a3d0ee93-165f-4093-bb38-70a6776d6f03.png",
      "bytes": 153253,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/005.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a3d0ee93-165f-4093-bb38-70a6776d6f03.png",
      "alt": "MCP Inspector displaying the deidentify_file tool with its input fields and the JSON response returned after processing a test medical image.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/d3ec5a5e-80db-48f8-8521-ce56ada47e4c.png",
      "bytes": 71249,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/006.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/d3ec5a5e-80db-48f8-8521-ce56ada47e4c.png",
      "alt": "Claude Desktop Search & Tools menu showing the Aegis MCP server and its available tools, including warm_up, deidentify_file, start_batch_job, get_job_status, summarize_run, and list_review_queue.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/68139acd-4fc7-4ad9-9199-4d419a0062f0.png",
      "bytes": 53588,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/007.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/68139acd-4fc7-4ad9-9199-4d419a0062f0.png",
      "alt": "Claude Desktop conversation where the user asks the Aegis MCP server to de-identify a medical image, and Claude reports summary statistics such as detected text regions, redactions, and whether manual review is required.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/70353644-c512-470c-a32e-72794d644343.png",
      "bytes": 94431,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/008.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/70353644-c512-470c-a32e-72794d644343.png",
      "alt": "Claude Desktop conversation showing the progress of a batch de-identification job, including processed files, decision counts, and current job status returned by the MCP server.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/1b5f583c-224c-4f89-bf09-3208332beafb.png",
      "bytes": 85678,
      "reused": true,
      "local_path": "attachments/931544a971ef/images/009.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/1b5f583c-224c-4f89-bf09-3208332beafb.png",
      "alt": "Claude Desktop generating a summary report of a completed de-identification run, including totals, decision breakdowns, and files requiring manual review based on Aegis audit records.",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://www.freecodecamp.org/news/build-ai-image-de-identification-for-clinical-research/",
      "label": "How to Build an AI-Powered Medical Image De-Identification Pipeline for Clinical Research",
      "type": "a"
    },
    {
      "href": "https://github.com/lakshmi-mahabaleshwara/aegis",
      "label": "https://github.com/lakshmi-mahabaleshwara/aegis",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/",
      "label": "Model Context Protocol documentation",
      "type": "a"
    },
    {
      "href": "https://github.com/modelcontextprotocol/python-sdk",
      "label": "MCP Python SDK",
      "type": "a"
    },
    {
      "href": "https://support.claude.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop",
      "label": "Getting started with local MCP servers on Claude Desktop",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:50:57Z",
  "source_url": "https://freecodecamp.org/news/build-a-privacy-first-medical-image-de-identification-agent",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 20347,
  "expected_body_images": 7,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/931544a971ef/pages/source.html",
  "local_html": "attachments/931544a971ef/pages/article.html",
  "body_base_path": "attachments/931544a971ef/pages/",
  "body_markdown_path": "attachments/931544a971ef/pages/article.md"
}