healthsec-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@healthsec-mcpcompute security posture score for my clinical model"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 splitsRelated 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 allEach 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-mcpdirectly (or the equivalentpython -m healthsec_mcp.server) -- no dataset flag needed.Need the model-touching tools too? Use
scripts/run_local_server.pywith 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_admissionneed PhysioNet-credentialed MIMIC-IV data;ckd/wdbcare 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.jsonOn 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-mcpcommand instead ofscripts/run_local_server.py, or the--datasetyou chose doesn't match the handle you referenced in your prompt (they're the same string, e.g.--dataset ckdgives youmodel_handle="ckd", not anything else).run_local_server.pycrashes on startup -- almost always a missing file under../data/.icu_mortality/ed_admissionspecifically require the PhysioNet-credentialed MIMIC-IV data (see "Data" below);ckd/wdbcshould 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 |
| implemented, golden-verified | yes | model, batch (n≤100), ε | flip rate, AUROC drop, plausibility rate |
| implemented (known limitation, see Status) | yes | model, batch | flip rate, drop, mean steps |
| 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) |
| implemented, golden-verified exactly | no | control set | PASS/PARTIAL/FAIL + mitigated/tested counts + coverage % |
| implemented, golden-verified exactly | no | already-executed probe results | pass count + enforcement rate |
| implemented, golden-verified exactly | no | audit log entries | completeness rate |
| implemented, golden-verified exactly | no | HIPAA/FHIR checklist | per-standard % + overall % |
| 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 |
| implemented | no | any subset of the above tools' outputs | Markdown + structured report; only states a deployment recommendation if |
| 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 toolsassess_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.
| Name | Required | Description | Default |
|---|---|---|---|
| control_set | Yes |
TDQS
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.
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.
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.
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.
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.
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`.
| Name | Required | Description | Default |
|---|---|---|---|
| probe_results | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auroc_drop | Yes | ||
| threat_total | Yes | ||
| threat_passed | Yes | ||
| threat_tested | Yes | ||
| threat_partial | Yes | ||
| compliance_score | Yes | ||
| threat_mitigated | Yes | ||
| rbac_enforcement_rate | Yes | ||
| audit_completeness_rate | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sps | No | ||
| fgsm | No | ||
| rbac | No | ||
| boundary | No | ||
| compliance | No | ||
| attack_coverage | No | ||
| audit_completeness | No | ||
| membership_inference | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| batch | Yes | ||
| max_steps | No | ||
| step_size | No | ||
| model_handle | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| batch | Yes | ||
| epsilon | No | ||
| model_handle | Yes | ||
| n_lime_samples | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| n_eval | No | ||
| member_pool | Yes | ||
| model_handle | Yes | ||
| nonmember_pool | Yes | ||
| n_shadow_models | No | ||
| shadow_model_size | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| audit_log | Yes | ||
| required_fields | No |
TDQS
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.
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.
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.
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.
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.
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`.
| Name | Required | Description | Default |
|---|---|---|---|
| checklist | Yes |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.1.0- First observed
assess_attack_coverage - First observed
check_rbac - First observed
compute_sps - First observed
generate_security_report - First observed
get_audit_log - First observed
run_boundary_attack - First observed
run_fgsm - First observed
run_membership_inference - First observed
score_audit_completeness - First observed
score_compliance
TDQS
Scored across 10 tools
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.
All tool names follow a consistent snake_case verb_noun pattern (e.g., run_fgsm, score_compliance). The naming is descriptive and predictable.
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.
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
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
HIPAA compliance AI agent — scan, grade, SRA, and generate compliance docs.
Pay-per-call cybersecurity for AI agents: vuln scans, threat intel, compliance, code security.
Threat modeling, code/cloud/pipeline scanning, shadow-AI discovery, compliance checks and fixes.
Security reviews for coding agents: diffs checked against your org policy and live infrastructure.
Related MCP Servers
- AlicenseAqualityBmaintenanceSecurity 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.10283Apache 2.0
- AlicenseBqualityCmaintenanceEnables 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.62MIT

AgentAuditofficial
AlicenseAqualityDmaintenanceEnables AI agents to scan MCP servers and AI packages for vulnerabilities, prompt injection, and supply chain attacks.722AGPL 3.0- AlicenseNot gradedqualityBmaintenanceSecurity scanning for AI agent skills, MCP servers, and agent prompts, returning signed trust scores and detailed findings.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MichaelEnny/healthsec-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server