Zero Harm AI MCP
Zero Harm AI MCP is a Model Context Protocol server that lets AI agents and runtime firewalls call Zero Harm AI safety checks for text, chat messages, prompts, tool inputs, and generated outputs.
The server is a thin adapter over zero-harm-ai-detectors. It should not duplicate detector logic from the detector package or from the Zero Harm AI GitHub Action.
Goals
- Expose PII, secret, and harmful-content detection through MCP tools.
- Return structured findings that agents and firewalls can enforce.
- Support local/self-hosted operation for sensitive data.
- Keep logs privacy-safe by default.
- Provide stable tool contracts that can be used by coding agents, chat agents, and firewall.
Non-Goals
- Reimplementing
zero-harm-ai-detectors. - Acting as a hosted service by default.
- Making policy enforcement decisions that belong to a firewall or calling agent.
- Replacing the Zero Harm AI GitHub Action.
Relationship To Other Projects
zero-harm-ai-detectors
Shared detector engine for PII, secrets, and harmful content.
zero-harm-ai-gh-action
GitHub Action and CI-oriented scanner for pull requests.
zero-harm-ai-mcp
MCP server adapter that exposes detector functionality to AI agents.
zero-harm-ai-firewall (future)
Runtime enforcement layer. It can call zero-harm-ai-mcp or use
zero-harm-ai-detectors directly.
Installation
Install from PyPI:
pip install zero-harm-ai-mcp
For local development:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
ruff check .
MCP Client Configuration
{
"mcpServers": {
"zero-harm-ai": {
"command": "zero-harm-ai-mcp",
"args": []
}
}
}
MCP Tools
zero_harm.scan_text
Scan one text string for PII, secrets, and harmful content.
Use this for prompt inputs, generated outputs, tool arguments, logs, and arbitrary text.
zero_harm.scan_messages
Scan chat-style messages while preserving message roles and indexes.
Use this when an agent wants to inspect a conversation before sending it to a model or tool.
zero_harm.redact_text
Return a redacted version of text plus findings.
Use this when the caller wants to continue safely after removing sensitive spans.
zero_harm.evaluate_policy
Map detector findings to an action recommendation.
Use this when a caller wants a normalized decision such as allow, warn, redact, or block.
Working Examples
These examples are generated from the current local server implementation.
zero_harm.scan_text
Input:
{
"text": "Contact alice@example.com before sharing the token.",
"targets": ["pii", "secret", "harmful"],
"redact": true
}
Output:
{
"schema_version": "1.0.0",
"risk_level": "medium",
"recommended_action": "redact",
"categories": [
"pii"
],
"summary": {
"total_findings": 1,
"pii": 1,
"secret": 0,
"harmful": 0
},
"findings": [
{
"type": "email",
"category": "pii",
"severity": "medium",
"confidence": 0.99,
"span": {
"start": 8,
"end": 25
},
"redacted": "[PII]",
"message_index": null,
"message_role": null,
"evidence_available": false
}
],
"redacted_text": "Contact [PII] before sharing the token."
}
zero_harm.scan_messages
Input:
{
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "My email is alice@example.com."
}
],
"targets": ["pii", "secret", "harmful"],
"redact": true
}
Output:
{
"schema_version": "1.0.0",
"risk_level": "medium",
"recommended_action": "redact",
"categories": [
"pii"
],
"summary": {
"total_findings": 1,
"pii": 1,
"secret": 0,
"harmful": 0
},
"findings": [
{
"type": "email",
"category": "pii",
"severity": "medium",
"confidence": 0.99,
"span": {
"start": 12,
"end": 29
},
"redacted": "[PII]",
"message_index": 1,
"message_role": "user",
"evidence_available": false
}
],
"redacted_text": "[{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}, {\"role\": \"user\", \"content\": \"My email is [PII].\"}]"
}
zero_harm.redact_text
Input:
{
"text": "aws_access_key_id = AKIAIOSFODNN7EXAMPLE",
"targets": ["pii", "secret", "harmful"]
}
Output:
{
"schema_version": "1.0.0",
"risk_level": "high",
"recommended_action": "block",
"categories": [
"secret"
],
"summary": {
"total_findings": 1,
"pii": 0,
"secret": 1,
"harmful": 0
},
"findings": [
{
"type": "api_key",
"category": "secret",
"severity": "high",
"confidence": 0.95,
"span": {
"start": 20,
"end": 40
},
"redacted": "[SECRET]",
"message_index": null,
"message_role": null,
"evidence_available": false
}
],
"redacted_text": "aws_access_key_id = [SECRET]"
}
zero_harm.evaluate_policy
Input:
{
"text": "Contact alice@example.com before sharing the token.",
"targets": ["pii", "secret", "harmful"],
"redact": false
}
Output:
{
"schema_version": "1.0.0",
"risk_level": "medium",
"recommended_action": "warn",
"categories": [
"pii"
],
"summary": {
"total_findings": 1,
"pii": 1,
"secret": 0,
"harmful": 0
}
}
Privacy Requirements
- Do not log raw input text by default.
- Do not log detected secret values by default.
- Include a config option for audit logs that stores only counts, categories, severities, and request metadata.
- Avoid sending data to external services unless explicitly configured.
- Keep the default transport local-first.
Development
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
ruff check .
Release
Build and validate distribution artifacts:
python -m build
twine check dist/*
See RELEASE.md for the full PyPI release flow.
Metadata
Release files for zero-harm-ai-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| zero_harm_ai_mcp-0.1.1.tar.gz | 15.5 kB | Without provenance | Details for zero_harm_ai_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| zero_harm_ai_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for zero_harm_ai_mcp-0.1.1-py3-none-any.whl |
Total release size: 24.6 kB
Release files / zero_harm_ai_mcp-0.1.1.tar.gz
| Download URL | zero_harm_ai_mcp-0.1.1.tar.gz |
|---|---|
| Size | 15.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78af7d1ea0d5e2039b0db5d43546cf825127153464030e81c372e5badd78da6c
|
|
BLAKE2b-256 checksum How to use checksums |
90d9a4e3bac2ffd7dcdaf8b7961014e6b701e86858dc43d9136bcc80fe6a2ac3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Release files / zero_harm_ai_mcp-0.1.1-py3-none-any.whl
| Download URL | zero_harm_ai_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 9.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
931425cca423922bce97652251bb1addaf8e5129a1e2bdb24ec4fc4edd716bd3
|
|
BLAKE2b-256 checksum How to use checksums |
b6b24b7470dec1bb0a033e106eb897a834bc4163fb524a07be48868b44cfe15a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Security for zero-harm-ai-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.