Skip to main content
Glama
MichaelEnny

healthsec-mcp

by MichaelEnny

healthsec-mcp

MCP connector for clinical-AI security evaluation: adversarial robustness, privacy leakage, and standards-compliance tools composed into a Security Posture Score, callable directly by AI agents.

Full paper structure, research contribution, and milestones: ../STRUCTURE.md. Practical tool-by-tool usage reference: docs/TOOLS.md. Illustrative worked example: examples/end_to_end_security_evaluation.md. Two ways to run this: locally via Claude Desktop (below), or via the agent-usefulness study harness (reproduce/agent_usefulness_study/).

Status: M1-M5 implemented, with two exceptions noted below. All 10 tools (the 9 planned + get_audit_log, added to close a gap found during M4) are registered on the server, lint-clean (ruff), type-clean (mypy), and covered by CI (.github/workflows/ci.yml). One documented open limitation remains: boundary attack's flip_rate/auroc_drop don't reproduce the reference numbers even though auroc_clean matches exactly (see TECHNICAL_DESIGN.md section 12; golden test marked xfail(strict=True)). Everything else that has a reference target is golden-verified -- exactly for the deterministic tools (M3 standards, M4 compute_sps), within tolerance for the ML-based ones (M1 run_fgsm). run_membership_inference (M2) has no published golden target (see TECHNICAL_DESIGN.md section 4.3) so it's covered by property tests only. The agent-usefulness study has been run once (6 tasks, real transcripts), but its rating data does not match the protocol's design — see reproduce/agent_usefulness_study/PROTOCOL.md's "Actual execution status" section for the full, honest account: the "2 raters" were, in turn, one person filling both columns, then one person plus ChatGPT as an LLM-judge cross-check. Neither is two independent human raters. A real second human rater still needs to score transcripts/blinded/ from scratch before this data can support the paper's agent-usefulness claim. Everything else in M5 (docs/TOOLS.md, CI, MCP contract tests, examples/) is done. See Milestones in STRUCTURE.md.

Layout

healthsec-mcp/
├── src/healthsec_mcp/
│   ├── adversarial/       # fgsm.py, boundary.py, plausibility.py -- implemented (M1)
│   ├── privacy/           # membership_inference.py -- implemented (M2)
│   ├── standards/         # attack_coverage.py, rbac.py, audit.py, compliance.py -- implemented (M3)
│   ├── tools/             # adversarial_tools.py, privacy_tools.py, standards_tools.py, sps_tools.py
│   ├── io/                # schemas.py -- FeatureBatch (n<=100), FeaturePool (n<=5000)
│   ├── registry.py        # in-session model-handle registry: handle -> model object map only
│   ├── authz.py           # authorization gate (M4) -- wraps registry.resolve(), records every
│   │                      # attempt (success or denial) to audit.py, regardless of outcome
│   ├── audit.py           # append-only log of this connector's own tool calls (M4)
│   ├── sps.py             # Security Posture Score composer (M4) -- weights are a parameter,
│   │                      # not hardcoded, per the open design question this resolved
│   ├── report.py          # generate_security_report's logic (M5) -- never states a deployment
│   │                      # recommendation unless compute_sps's output was actually supplied
│   ├── server.py          # FastMCP server, registers all 10 implemented tools
│   └── local_datasets.py  # shared loader/registrar for the 4 local models -- the one place
│                          # CONNECTOR_DATA_ROOT is resolved, used by study_server.py and
│                          # scripts/run_local_server.py so path logic isn't duplicated per script
├── tests/
│   ├── unit/              # per-module unit tests (synthetic models + pure-function cases, fast) --
│   │                      # includes test_sps.py (exact SPS=78.9 golden match), test_authz.py/
│   │                      # test_audit.py (gate + audit-trail behavior), test_report.py
│   ├── golden/            # regression tests against reference/ (validated result tables) --
│   │                      # standards tools + compute_sps match exactly; ML-attack tools match
│   │                      # within tolerance (boundary attack currently xfails, see Status)
│   ├── contract/          # MCP tool-schema contract tests (M5) -- every tool has a real
│   │                      # description + valid JSON Schema; spot-checks required params
│   └── fault_injection/   # bad models/inputs, cap enforcement (FGSM n≤100, MI pool≤5k)
├── reproduce/
│   ├── diagnose_boundary_discrepancy.py     # fast standalone RNG/AUROC diagnostic
│   ├── diagnose_nearest_vs_first.py         # confirms nearest vs. first-found pick different points
│   ├── diagnose_nearest_full_compare.py     # confirms they still give identical attack outcomes
│   ├── run_attacks.py     # run FGSM + boundary attack against any of the 4 local models
│   ├── results/           # tracked: JSON output of run_attacks.py (aggregate metrics, no PHI)
│   └── agent_usefulness_study/    # (M5) PROTOCOL.md + full execution harness (study_server.py,
│                                  # run_study.py, blind_transcripts.py, analyze_ratings.py) --
│                                  # has been run once, see Status and PROTOCOL.md
├── scripts/
│   └── run_local_server.py  # stdio entry point for Claude Desktop -- pre-registers one of the
│                             # 4 local models under a fixed handle, see "Running with Claude Desktop"
├── reference/              # tracked: validated result tables (aggregate metrics, no PHI)
├── examples/               # (M5) end_to_end_security_evaluation.md -- illustrative, hand-authored
│                           # transcript with real reference numbers, not a live-recorded session
├── docs/                   # (M5) TOOLS.md -- practical tool-by-tool usage reference
└── .github/workflows/      # (M5) ci.yml -- ruff + mypy + pytest, path-scoped to this connector

../data/                    # sibling to this package, gitignored (see ../.gitignore)
├── models/                 # icu_mortality_rf.pkl, ed_admission_rf.pkl, ckd_rf.pkl, wdbc_rf.pkl, *_meta.json
├── mimic/                  # icu_cohort/, ed_cohort/ train+test splits
├── ckd/processed/          # train+test splits
└── breast_cancer/processed/  # train+test splits

Related MCP server: RedTeam ML API MCP

Running the tests

This project's path (deeply nested under the thesis directory tree) exceeds Windows' 260-character limit for scikit-learn's compiled binaries, so the venv must live at a short path outside the project. Replace <you> below with your actual Windows username (e.g. C:\Users\wisdo\...) -- it's a placeholder, not literal text to paste:

uv venv --python 3.11 "C:\Users\<you>\.venvs\healthsec-mcp"
uv pip install -e ".[dev]" --python "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe"

# fast suites (~25s) -- unit, fault-injection, and MCP contract tests
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" -m pytest tests/unit tests/fault_injection tests/contract -v

# golden regression against ../data/ (~7 min -- LIME explains each sample individually)
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" -m pytest tests/golden -v -s

# lint + type-check (instant, what CI runs)
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" -m ruff check src/ tests/ reproduce/ scripts/
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" -m mypy src/ scripts/run_local_server.py

../data/models/ and ../data/mimic/ must be populated first (see Data below). CI (.github/workflows/ci.yml) runs pytest tests/ directly, letting the MIMIC-IV-dependent golden tests skip automatically via their own skipif../data/ is gitignored and never present in CI.

Running attacks against a model

reproduce/run_attacks.py runs FGSM + boundary attack against any of the four locally available models. icu_mortality/ed_admission are the regression baseline (compared against reference/ in the golden tests); ckd/wdbc have no published ground truth -- this is new evaluation used to demonstrate the tools generalize beyond the two validated cohorts.

# one dataset at a time
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" reproduce\run_attacks.py --dataset ckd
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" reproduce\run_attacks.py --dataset wdbc
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" reproduce\run_attacks.py --dataset icu_mortality
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" reproduce\run_attacks.py --dataset ed_admission

# all four in one run (slowest -- icu_mortality/ed_admission each have up to
# 100 samples for boundary attack, similar runtime to the golden tests)
& "C:\Users\<you>\.venvs\healthsec-mcp\Scripts\python.exe" reproduce\run_attacks.py --dataset all

Each run writes its results to reproduce/results/<dataset>_attack_results.json (tracked in git, overwritten on each run) so nothing is lost once the terminal scrolls past it.

Running with Claude Desktop

This connects healthsec-mcp to Claude Desktop as a local MCP server -- Claude Desktop spawns it as a subprocess and talks to it over stdio. This is the intended way to actually use the connector day to day; the other supported path is the agent-usefulness study harness (reproduce/agent_usefulness_study/), which spawns the same server programmatically to script Condition A/B comparisons instead.

Two categories of tools, two setup paths

The 7 standards/SPS/report tools (assess_attack_coverage, check_rbac, score_audit_completeness, score_compliance, compute_sps, generate_security_report, get_audit_log) don't touch a registered model at all -- they score or compose evidence you pass directly in the tool call. These work with zero setup the moment Claude Desktop can launch the server at all.

The 3 model-touching tools (run_fgsm, run_boundary_attack, run_membership_inference) need a model registered under a model_handle before Claude can call them. This is the part that trips people up: Claude Desktop spawns healthsec-mcp as a brand-new subprocess with an empty registry every time -- there's no interactive Python session inside that subprocess for you to call registry.register() from after the fact. scripts/run_local_server.py solves this: it's a small wrapper that loads one of your 4 local models, registers it under a fixed, predictable handle, and then starts the same server -- point Claude Desktop at this script instead of the bare healthsec-mcp command if you need the model-touching tools.

Setup

1. Make sure the venv is set up (see "Running the tests" above if not).

2. Decide which path you need:

  • Only need the standards/SPS/report tools? Skip to step 4 and point Claude Desktop at healthsec-mcp directly (or the equivalent python -m healthsec_mcp.server) -- no dataset flag needed.

  • Need the model-touching tools too? Use scripts/run_local_server.py with one of --dataset icu_mortality|ed_admission|ckd|wdbc. This requires ../data/models/ and the matching processed dataset to already be populated (see "Data" below) -- icu_mortality/ed_admission need PhysioNet-credentialed MIMIC-IV data; ckd/wdbc are public and work out of the box if you've run the setup in "Running the tests."

3. Find (or create) Claude Desktop's config file:

%APPDATA%\Claude\claude_desktop_config.json

On Windows that's typically C:\Users\<you>\AppData\Roaming\Claude\claude_desktop_config.json. If the file doesn't exist yet, create it with just {"mcpServers": {}} and add your entry inside.

4. Add an entry under mcpServers. Replace <you> with your actual Windows username and adjust the repo path to match where you've cloned this project. Model-touching setup (recommended default -- gives you all 10 tools):

{
  "mcpServers": {
    "healthsec": {
      "command": "C:\\Users\\<you>\\.venvs\\healthsec-mcp\\Scripts\\python.exe",
      "args": [
        "C:\\Users\\<you>\\OneDrive\\Desktop\\University_of_the_Cumberlands\\Courses\\Thesis_2026_Proposing\\Papers_and_Code\\ai-agents-connectors\\01-healthcare-ai-security-connector\\healthsec-mcp\\scripts\\run_local_server.py",
        "--dataset",
        "icu_mortality"
      ]
    }
  }
}

Standards/report-tools-only setup (no model registration, works without ../data/ at all):

{
  "mcpServers": {
    "healthsec": {
      "command": "C:\\Users\\<you>\\.venvs\\healthsec-mcp\\Scripts\\healthsec-mcp.exe"
    }
  }
}

JSON requires double backslashes in Windows paths (\\, not \) -- copy the pattern above exactly, don't use single backslashes.

5. Restart Claude Desktop completely (quit from the system tray, not just close the window) so it picks up the config change.

6. Verify it connected. In a new Claude Desktop chat, look for a tools/connector icon indicating healthsec is available, or just ask Claude something that requires a tool, e.g. "What MCP tools do you have available from healthsec?" If nothing shows up, check Claude Desktop's logs (Help menu, or %APPDATA%\Claude\logs\) for a subprocess spawn error -- the most common cause is a typo'd path or JSON syntax error in the config file.

Using it

If you registered a model (step 2's model-touching path), reference the handle directly in your prompt -- it equals the dataset name you chose, e.g.:

Using model_handle="icu_mortality", check whether this model is vulnerable to small adversarial perturbations.

For the standards/report tools, just supply the evidence directly (Claude will ask for it, or you can paste it inline) -- see docs/TOOLS.md for a worked example of every tool, including the exact input shapes each one expects.

Troubleshooting

  • Claude says it has no tools from healthsec -- almost always a config path typo, or Claude Desktop wasn't fully restarted. Check the logs mentioned in step 6.

  • Model-touching tools fail with "model_handle is not registered" -- you're pointed at the bare healthsec-mcp command instead of scripts/run_local_server.py, or the --dataset you chose doesn't match the handle you referenced in your prompt (they're the same string, e.g. --dataset ckd gives you model_handle="ckd", not anything else).

  • run_local_server.py crashes on startup -- almost always a missing file under ../data/. icu_mortality/ed_admission specifically require the PhysioNet-credentialed MIMIC-IV data (see "Data" below); ckd/wdbc should work if you've completed the venv setup in "Running the tests," since those two are the ones with no such restriction.

MCP tools

Tool

Status

Authz-gated?

Input

Output

run_fgsm

implemented, golden-verified

yes

model, batch (n≤100), ε

flip rate, AUROC drop, plausibility rate

run_boundary_attack

implemented (known limitation, see Status)

yes

model, batch

flip rate, drop, mean steps

run_membership_inference

implemented, no published golden target

yes

model, member_pool + nonmember_pool (≤5k each)

MI accuracy/AUROC, privacy risk, patients-at-risk (direct count, not extrapolated)

assess_attack_coverage

implemented, golden-verified exactly

no

control set

PASS/PARTIAL/FAIL + mitigated/tested counts + coverage %

check_rbac

implemented, golden-verified exactly

no

already-executed probe results

pass count + enforcement rate

score_audit_completeness

implemented, golden-verified exactly

no

audit log entries

completeness rate

score_compliance

implemented, golden-verified exactly

no

HIPAA/FHIR checklist

per-standard % + overall %

compute_sps

implemented, golden-verified exactly (SPS=78.9 on reference inputs)

no

the 9 subscore inputs above

composite SPS 0–100, deployment tier, per-dimension breakdown

generate_security_report

implemented

no

any subset of the above tools' outputs

Markdown + structured report; only states a deployment recommendation if sps was supplied

get_audit_log

implemented

no

(none)

this session's full audit trail

"Authz-gated" tools resolve model_handle through authz.authorize(), which records every attempt to the audit trail whether it succeeds or is denied. Standards, compute_sps, generate_security_report, and get_audit_log don't touch a model at all -- they score/compose evidence the caller already has -- so they aren't gated.

See docs/TOOLS.md for a worked example of every tool plus a full end-to-end workflow.

Audit trail

Every authz-gated tool call is recorded to audit.default_audit_log in-memory, for the life of the server process: {timestamp, tool, model_handle, authorized, input_hash, detail}. This is the connector's own non-repudiation record; retrieve it via the get_audit_log tool. You can audit the auditor: standards.audit.score_audit_completeness will happily score default_audit_log.entries() against the same completeness check it runs on any other log, though the field names differ (this log's schema is authz.py's own, not the validated methodology's REQUIRED_FIELDS).

Tech stack

Python 3.11 (not 3.13 — passlib/bcrypt incompatibility; use import bcrypt directly), mcp (FastMCP), scikit-learn, numpy/pandas, FastAPI, pytest. License: Apache 2.0.

Data

MIMIC-IV ICU + ED cohorts and trained RF models. reference/ (this directory) holds the validated result tables — small, aggregate, no PHI, safe to commit. ../data/ (one level up, sibling to this package) holds the actual models and MIMIC-IV-derived data used to run the golden tests locally — this requires PhysioNet credentialing and is gitignored at the connector root (../.gitignore); it must never be committed or published. Override its location with CONNECTOR_DATA_ROOT if needed.

Safety

Adversarial and privacy-attack tools are scoped to a user's own models and gated behind an authorization check (authz.py) — a model only becomes usable by being registered directly through registry.py's Python API in the user's own script; there is no MCP tool that lets an agent register or guess a handle. Every authorized and denied attempt is recorded to the audit trail (audit.py) — see "Risks / limitations / ethics" in ../STRUCTURE.md.

Available Tools

10 tools
assess_attack_coverageA

Score MITRE ATT&CK-style threat-coverage from per-control test results.

    Each entry in `control_set` needs `result` ("PASS"/"PARTIAL"/"FAIL")
    and may include `mitigation_implemented`/`tested` booleans. A
    PARTIAL counts as half-covered.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
control_setYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explains that PARTIAL counts as half-covered, but does not describe the output format, error handling, or any side effects. Some behavioral info is given, but significant gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two sentences and a bullet-like list of required fields. No unnecessary words, and the main purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no output schema, the description adequately explains input requirements but does not mention what the scoring output looks like. Slightly incomplete, but sufficient for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no property definitions (additionalProperties: true), so the description is essential. It specifies that each entry needs 'result' with values 'PASS'/'PARTIAL'/'FAIL' and optional booleans, adding critical meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scores MITRE ATT&CK-style threat-coverage from per-control test results. The verb 'score' and resource 'threat-coverage' are specific, and it distinguishes from siblings like score_audit_completeness and score_compliance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use: when you have per-control test results with specific fields. However, it does not explicitly mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_rbacA

Score RBAC enforcement from already-executed endpoint/role probes.

    This tool does not make live HTTP calls -- probe the system
    yourself and pass the results here. Each entry needs `expected`
    ("ALLOWED" or "DENIED") and the observed `status_code`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
probe_resultsYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the non-live nature and required input fields, but lacks details on side effects, rate limits, or output behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words — purpose and key usage constraints are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides essential info but lacks description of return value or scoring logic. For a tool with no output schema, this gap reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%. The description adds critical meaning by specifying that each object in probe_results needs 'expected' (ALLOWED/DENIED) and 'status_code', which the schema does not define.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scores RBAC enforcement from already-executed probes, distinguishing it from sibling tools that make live calls or perform other analyses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says the tool does not make live HTTP calls and instructs the user to probe the system first and pass results — providing clear when-to-use and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_spsB

Compose the Security Posture Score from four dimension inputs.

    `auroc_drop` should be the WORST-CASE drop across all adversarial
    attack runs performed (max, not mean, across FGSM/boundary and
    any datasets evaluated) -- that's what the validated weighting
    was calibrated against. `compliance_score` is a fraction (0-1),
    e.g. `score_compliance`'s `overall_pct` divided by 100.

    Returns the composite SPS (0-100), a deployment recommendation
    tier, and each dimension's subscore/weight/contribution for a
    transparent breakdown.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
auroc_dropYes
threat_totalYes
threat_passedYes
threat_testedYes
threat_partialYes
compliance_scoreYes
threat_mitigatedYes
rbac_enforcement_rateYes
audit_completeness_rateYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behaviors. It explains the return value (composite SPS 0-100, deployment recommendation tier, subscore breakdown) and clarifies input meanings (auroc_drop worst-case, compliance_score fraction). However, it omits side effects, idempotency, or state changes, and does not mention authorizations or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively concise with two paragraphs, front-loaded with the main purpose. It includes necessary detail about auroc_drop and output but could be more structured (e.g., using bullet points) for clarity. Every sentence adds value, though some redundancy exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 required parameters, no output schema, and no annotations, the description is incomplete. It explains the composite output concept but lacks detailed descriptions of most input parameters, output structure, validation rules, or handling of edge cases. More context is needed for reliable agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, requiring the description to explain all 9 parameters. Only auroc_drop and compliance_score are described with specific meaning and constraints. The other 7 parameters (threat_tested, threat_passed, etc.) are merely named in the schema with type but not explained, leaving significant gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool composes the Security Posture Score from four dimension inputs, listing specific inputs like auroc_drop, threat metrics, audit completeness, etc. It distinguishes from sibling tools by being the composite calculator, contrasting with individual assessment tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when all dimension inputs are available but provides no explicit guidance on when to use this tool versus alternatives like assess_attack_coverage or score_compliance. It instructs on the proper format for auroc_drop and compliance_score but lacks when-not-to-use or prerequisite context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_security_reportA

Compose a structured security report from whichever tool outputs you have.

    Pass the raw dict returned by any subset of run_fgsm,
    run_boundary_attack, run_membership_inference,
    assess_attack_coverage, check_rbac, score_audit_completeness,
    score_compliance, and compute_sps. Sections you didn't run are
    marked "not evaluated", never silently assumed to pass. A
    deployment recommendation only appears if `sps` (compute_sps's
    own output) is supplied -- it is never inferred from partial
    results.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
spsNo
fgsmNo
rbacNo
boundaryNo
complianceNo
attack_coverageNo
audit_completenessNo
membership_inferenceNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses key behaviors: sections not run are marked 'not evaluated', deployment recommendation only appears if sps is supplied, never inferred. This is thorough and honest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two paragraphs, front-loaded with purpose, and every sentence provides necessary information without waste. It is well-structured and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 optional parameters and no output schema, the description provides good context for inputs but lacks details on the output format (e.g., JSON, Markdown). While 'structured security report' is mentioned, the agent might need more specifics about the return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and parameters are untyped objects. The description adds meaning by linking parameters to tool outputs (e.g., 'fgsm' from run_fgsm) and explains the special role of 'sps'. However, the mapping from parameter names to tool names is implicit and could be clearer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it composes a structured security report from outputs of specific sibling tools, listing them explicitly and explaining how missing sections are handled. This distinguishes it from individual assessment tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains to pass raw dicts from any subset of the listed tools. It also clarifies constraints (no silent assumptions, deployment recommendation only with sps). While it doesn't explicitly state when to use alternatives, the purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audit_logA

Return this session's audit trail.

    Every authz-gated tool call (run_fgsm, run_boundary_attack,
    run_membership_inference) is recorded here, whether it was
    authorized or denied.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that it returns a record of tool calls with authorization decisions, implying no side effects. Could be more explicit about being read-only, but sufficient for a simple retrieval.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two very concise sentences with front-loaded core purpose. Every sentence adds value: 'Return this session's audit trail' and details what is recorded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is simple but lacks details about the return structure (e.g., fields in each entry). Given no output schema, more detail on the audit trail format would improve completeness. However, for a parameterless tool, it adequately conveys the basic function.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so baseline 4 applies. The description adds no parameter info, which is acceptable since none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the session's audit trail and specifies exactly what is recorded (authz-gated tool calls with authorization status). It is a specific verb-resource pair and distinguishes itself from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: get the raw audit log for session. It does not explicitly state when to use it vs alternatives like score_audit_completeness, but the purpose is clear. Lacks explicit when-not or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_boundary_attackA

Run an iterative decision-boundary attack against a registered model.

    Moves each sample in `batch` toward an opposite-predicted-class
    sample drawn from the same batch, one step at a time, until the
    model's prediction flips or `max_steps` is exhausted. `batch` is
    capped at 100 samples -- the validated protocol limit.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
batchYes
max_stepsNo
step_sizeNo
model_handleYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the iterative nature, the condition for stopping (prediction flip or max_steps), the batch cap limit (100), and the sampling from same batch. However, it does not specify permissions, side effects, or return format, but for an adversarial attack tool, the disclosed behavior is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two non-redundant sentences that front-load the key purpose and behavior. It is concise with no filler, though some minor detail on parameter roles could be added without breaking conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four parameters, no output schema, and no annotations, the description explains the algorithm and constraints but lacks complete parameter descriptions and return value information. It covers the core operation but leaves gaps in parameter semantics, making it moderately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add parameter meaning. It only explains the 'batch' parameter indirectly (capped at 100) and mentions 'max_steps' but not 'step_size' or 'model_handle'. This leaves two parameters undocumented, providing insufficient semantic context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs an iterative decision-boundary attack, describing the process of moving samples toward opposite-predicted-class samples until prediction flips or max_steps exhausted. It also mentions the batch cap, distinguishing it from sibling tools like run_fgsm which use different attack methods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the tool's operation and limits but does not explicitly state when to use this attack versus alternatives (e.g., run_fgsm) or when not to use it. Guidelines for context are implied by the algorithm description but lack direct comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_fgsmB

Run a LIME-guided FGSM adversarial attack against a registered model.

    `batch` is capped at 100 samples -- the validated protocol limit.
    Returns AUROC drop, flip rate, and the clinical-plausibility rate of
    the generated adversarial samples. A 100% plausibility rate does not
    mean the attack failed: it means bounds clipping alone does not stop
    the attack, since perturbations are clipped to clinical bounds by
    construction.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
batchYes
epsilonNo
model_handleYes
n_lime_samplesNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the batch cap (100 samples), return metrics, and clarifies a common misconception about plausibility rate. However, it does not state whether the tool modifies the model, requires authentication, or has other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact with three sentences, each serving a purpose: stating the action, capping batch, and explaining return values. It is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no output schema, and no parameter descriptions in the schema, the description omits critical details about seed, epsilon, n_lime_samples, and model registration requirements. This leaves the agent underinformed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only describes the batch parameter (cap) and implicitly mentions epsilon via the attack name. Other parameters (seed, model_handle, n_lime_samples, epsilon) are left unexplained, leaving the agent without sufficient understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Run a LIME-guided FGSM adversarial attack against a registered model.' This clearly states what the tool does and differentiates it from sibling tools like run_boundary_attack or run_membership_inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like run_boundary_attack. The description does not mention prerequisites or scenarios where this attack is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_membership_inferenceA

Run a shadow-model membership-inference attack against a registered model.

    `member_pool` must be rows known to have been in the model's
    training set -- it trains the shadow models and supplies the
    known-member evaluation sample. `nonmember_pool` must be rows
    known NOT to have been in training (e.g. a held-out test split) --
    it supplies the known-non-member evaluation sample only. Each pool
    is capped at 5,000 samples; shadow-model training does not scale
    past this in the validated protocol.

    Returns the attack's accuracy/AUROC at distinguishing members from
    non-members, a privacy-risk tier, and a direct count of how many
    of the evaluated members would be identifiable -- not a
    population-scale extrapolation.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
n_evalNo
member_poolYes
model_handleYes
nonmember_poolYes
n_shadow_modelsNo
shadow_model_sizeNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully carries the burden. It discloses that shadow models are trained, pools are capped, returns specific metrics, and that the result is not a population-scale extrapolation. It lacks information on authorization or computational cost, but the key behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with key points front-loaded. It is reasonably concise, though it uses backticks for code elements. Every sentence provides useful information, though some details could be condensed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return value (accuracy/AUROC, privacy-risk tier, direct count) and clarifies no population-scale extrapolation. However, for 7 parameters, only the two pools are well explained; other parameters (seed, n_eval, n_shadow_models, shadow_model_size) lack any explanation in the description, relying on their default values for context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning no parameter descriptions exist. The description adds value by explaining the roles of member_pool (trains shadow models and supplies eval sample) and nonmember_pool (only supplies eval sample) and the 5,000 sample cap. However, it does not explain seed, n_eval, n_shadow_models, or shadow_model_size beyond their defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it runs a shadow-model membership-inference attack against a registered model. It uses specific verbs and identifies the resource (model) and attack type, distinguishing it from siblings like run_boundary_attack (adversarial examples) and assess_attack_coverage (coverage assessment).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the necessity of both member_pool and nonmember_pool, and mentions the cap of 5,000 samples. It implies usage when evaluating membership leakage for a registered model, but does not explicitly state when not to use or provide alternative tool references. The context is clear enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_audit_completenessA

Score audit-log completeness for non-repudiation.

    An entry is complete only if every required field is present and
    not null. `required_fields` defaults to the validated field set:
    timestamp, event, user_id, role, patient_id_hash, model_name,
    model_version, input_feature_hash, prediction, confidence.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
audit_logYes
required_fieldsNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It explains the condition for completeness (all required fields present and not null), which is a key behavioral trait. However, it does not mention whether the tool is read-only, side effects, performance, or authentication requirements, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: two sentences that cover purpose and behavior. No wasted words; every piece adds value. The structure front-loads the purpose, then explains the logic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, no output schema, no nested objects), the description is nearly complete. It explains scoring logic and default fields. However, it omits the output format (e.g., a score per entry or aggregate), which would be helpful for an agent to interpret returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates partially. It clarifies that required_fields defaults to a predefined list when null and defines what constitutes completeness. However, it does not provide details about the audit_log parameter's expected structure, leaving ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: scoring audit-log completeness for non-repudiation. The verb 'score' and resource 'audit-log completeness' are specific. The context of non-repudiation and the list of default required fields differentiate it from sibling tools like assess_attack_coverage or check_rbac.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (when assessing completeness for non-repudiation) but does not explicitly state when not to use or provide alternatives. It lacks explicit guidance on preferred scenarios compared to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_complianceA

Score a HIPAA/FHIR compliance checklist.

    Each entry needs `id` (prefixed "HIPAA-..." or "FHIR-..." to
    determine which standard it belongs to), `status`
    ("PASS"/"PARTIAL"/"FAIL"/null), and `weight`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
checklistYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must convey behavioral traits. It explains input requirements but does not disclose return format, side effects, error behavior, or whether the tool is read-only. This is adequate but misses critical details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no fluff. The purpose is stated first, followed by parameter requirements. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers input constraints well but lacks any explanation of the output (e.g., what the score represents, data format). Without output schema, this is a notable gap. Examples or return value details would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is minimal (array of objects with no property definitions). The description adds significant meaning by specifying required fields (id with prefix constraints, status enum, weight). This fully compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it scores a HIPAA/FHIR compliance checklist, specifying the required fields. However, it does not explicitly differentiate from the sibling 'score_audit_completeness', which may cause confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., score_audit_completeness). Implicitly, it is used for compliance scoring, but no exclusions or context are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 10 tool updatesv0.1.0
    • First observedassess_attack_coverage
    • First observedcheck_rbac
    • First observedcompute_sps
    • First observedgenerate_security_report
    • First observedget_audit_log
    • First observedrun_boundary_attack
    • First observedrun_fgsm
    • First observedrun_membership_inference
    • First observedscore_audit_completeness
    • First observedscore_compliance

TDQS

A4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool has a clearly distinct purpose targeting different security assessment areas (attack types, scoring, compliance, audit, reporting). There is no overlap that would confuse an agent.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (e.g., run_fgsm, score_compliance). The naming is descriptive and predictable.

Tool Count5/5

With 10 tools covering adversarial attacks, scoring, compliance, audit, and reporting, the count is well-scoped for its domain. Each tool earns its place without being excessive.

Completeness4/5

The tool surface covers core security assessment workflows (attacks, scoring, reports) but lacks explicit model registration tools; models are assumed pre-registered, which is a minor gap.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Security co-pilot for AI agents. Scans for vulnerabilities like prompt injection, infinite loops, and token bombing in AI Agents, audits MCP servers, verifies AGENTS.md governance, and generates EU AI Act compliance reports.
    10
    28
    3
    Apache 2.0
  • A
    license
    B
    quality
    C
    maintenance
    Enables security teams to run controlled adversarial penetration tests against authorized ML/LLM API endpoints, scoring responses and generating evidence for compliance frameworks such as SOC 2, ISO 27001, and GDPR.
    6
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Security scanning for AI agent skills, MCP servers, and agent prompts, returning signed trust scores and detailed findings.
    MIT

Latest Blog Posts

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/MichaelEnny/healthsec-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server