@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
112 lines • 13.6 kB
JavaScript
/**
* Collects blocked-attack counts and per-severity breakdowns from a
* SecurityTelemetry instance. The current hour's attack rate is surfaced as a
* gauge so dashboards can display a rolling "attacks this hour" reading.
*/
const SOURCE = 'SecurityTelemetry';
export class SecurityTelemetryCollector {
telemetry;
name = 'security-telemetry';
description = 'Blocked attack counts, unique vectors, and severity breakdown from SecurityTelemetry';
constructor(telemetry) {
this.telemetry = telemetry;
}
collect() {
try {
const m = this.telemetry.getMetrics();
// attacksPerHour is a 24-element array indexed by hours-ago (0 = current hour)
const attacksThisHour = Array.isArray(m.attacksPerHour) ? (m.attacksPerHour[0] ?? 0) : 0;
const entries = [
{
type: 'gauge',
name: 'security.telemetry.blocked_total',
source: SOURCE,
unit: 'count',
description: 'Total blocked attack attempts since process start',
value: m.totalBlockedAttempts,
},
{
type: 'gauge',
name: 'security.telemetry.unique_vectors',
source: SOURCE,
unit: 'count',
description: 'Number of distinct attack vectors observed',
value: m.uniqueAttackVectors,
},
{
type: 'gauge',
name: 'security.telemetry.blocked_by_severity',
source: SOURCE,
unit: 'count',
description: 'Blocked attacks broken down by severity',
labels: { severity: 'critical' },
value: m.criticalAttacksBlocked,
},
{
type: 'gauge',
name: 'security.telemetry.blocked_by_severity',
source: SOURCE,
unit: 'count',
description: 'Blocked attacks broken down by severity',
labels: { severity: 'high' },
value: m.highSeverityBlocked,
},
{
type: 'gauge',
name: 'security.telemetry.blocked_by_severity',
source: SOURCE,
unit: 'count',
description: 'Blocked attacks broken down by severity',
labels: { severity: 'medium' },
value: m.mediumSeverityBlocked,
},
{
type: 'gauge',
name: 'security.telemetry.blocked_by_severity',
source: SOURCE,
unit: 'count',
description: 'Blocked attacks broken down by severity',
labels: { severity: 'low' },
value: m.lowSeverityBlocked,
},
{
type: 'gauge',
name: 'security.telemetry.attacks_per_hour',
source: SOURCE,
unit: 'count',
description: 'Attack attempts recorded in the current clock hour',
value: attacksThisHour,
},
{
type: 'gauge',
name: 'security.telemetry.dedup_suppressed',
source: SOURCE,
unit: 'count',
description: 'Repeated events suppressed by deduplication',
value: m.deduplication.suppressedEvents,
},
{
type: 'gauge',
name: 'security.telemetry.dedup_unique',
source: SOURCE,
unit: 'count',
description: 'Unique events that passed through deduplication',
value: m.deduplication.uniqueEvents,
},
{
type: 'gauge',
name: 'security.telemetry.dedup_cache_size',
source: SOURCE,
unit: 'count',
description: 'Current deduplication cache size',
value: m.deduplication.cacheSize,
},
];
return entries;
}
catch {
return [];
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHlUZWxlbWV0cnlDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL1NlY3VyaXR5VGVsZW1ldHJ5Q29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFLSCxNQUFNLE1BQU0sR0FBRyxtQkFBNEIsQ0FBQztBQUU1QyxNQUFNLE9BQU8sMEJBQTBCO0lBS1I7SUFKcEIsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQzVCLFdBQVcsR0FDbEIsc0ZBQXNGLENBQUM7SUFFekYsWUFBNkIsU0FBNEI7UUFBNUIsY0FBUyxHQUFULFNBQVMsQ0FBbUI7SUFBRyxDQUFDO0lBRTdELE9BQU87UUFDTCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXRDLCtFQUErRTtZQUMvRSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFekYsTUFBTSxPQUFPLEdBQWtCO2dCQUM3QjtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxrQ0FBa0M7b0JBQ3hDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG1EQUFtRDtvQkFDaEUsS0FBSyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7aUJBQzlCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtpQkFDN0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0NBQXdDO29CQUM5QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7b0JBQ2hDLEtBQUssRUFBRSxDQUFDLENBQUMsc0JBQXNCO2lCQUNoQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSx3Q0FBd0M7b0JBQzlDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLHlDQUF5QztvQkFDdEQsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtvQkFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7aUJBQzdCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLHdDQUF3QztvQkFDOUMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUseUNBQXlDO29CQUN0RCxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO29CQUM5QixLQUFLLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtpQkFDL0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0NBQXdDO29CQUM5QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx5Q0FBeUM7b0JBQ3RELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7b0JBQzNCLEtBQUssRUFBRSxDQUFDLENBQUMsa0JBQWtCO2lCQUM1QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG9EQUFvRDtvQkFDakUsS0FBSyxFQUFFLGVBQWU7aUJBQ3ZCO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0I7aUJBQ3hDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGlDQUFpQztvQkFDdkMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsaURBQWlEO29CQUM5RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZO2lCQUNwQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtDQUFrQztvQkFDL0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUztpQkFDakM7YUFDRixDQUFDO1lBRUYsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29sbGVjdHMgYmxvY2tlZC1hdHRhY2sgY291bnRzIGFuZCBwZXItc2V2ZXJpdHkgYnJlYWtkb3ducyBmcm9tIGFcbiAqIFNlY3VyaXR5VGVsZW1ldHJ5IGluc3RhbmNlLiBUaGUgY3VycmVudCBob3VyJ3MgYXR0YWNrIHJhdGUgaXMgc3VyZmFjZWQgYXMgYVxuICogZ2F1Z2Ugc28gZGFzaGJvYXJkcyBjYW4gZGlzcGxheSBhIHJvbGxpbmcgXCJhdHRhY2tzIHRoaXMgaG91clwiIHJlYWRpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VjdXJpdHlUZWxlbWV0cnkgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90ZWxlbWV0cnkvU2VjdXJpdHlUZWxlbWV0cnkuanMnO1xuXG5jb25zdCBTT1VSQ0UgPSAnU2VjdXJpdHlUZWxlbWV0cnknIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlUZWxlbWV0cnlDb2xsZWN0b3IgaW1wbGVtZW50cyBJTWV0cmljQ29sbGVjdG9yIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdzZWN1cml0eS10ZWxlbWV0cnknO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9XG4gICAgJ0Jsb2NrZWQgYXR0YWNrIGNvdW50cywgdW5pcXVlIHZlY3RvcnMsIGFuZCBzZXZlcml0eSBicmVha2Rvd24gZnJvbSBTZWN1cml0eVRlbGVtZXRyeSc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0ZWxlbWV0cnk6IFNlY3VyaXR5VGVsZW1ldHJ5KSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnRlbGVtZXRyeS5nZXRNZXRyaWNzKCk7XG5cbiAgICAgIC8vIGF0dGFja3NQZXJIb3VyIGlzIGEgMjQtZWxlbWVudCBhcnJheSBpbmRleGVkIGJ5IGhvdXJzLWFnbyAoMCA9IGN1cnJlbnQgaG91cilcbiAgICAgIGNvbnN0IGF0dGFja3NUaGlzSG91ciA9IEFycmF5LmlzQXJyYXkobS5hdHRhY2tzUGVySG91cikgPyAobS5hdHRhY2tzUGVySG91clswXSA/PyAwKSA6IDA7XG5cbiAgICAgIGNvbnN0IGVudHJpZXM6IE1ldHJpY0VudHJ5W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF90b3RhbCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGJsb2NrZWQgYXR0YWNrIGF0dGVtcHRzIHNpbmNlIHByb2Nlc3Mgc3RhcnQnLFxuICAgICAgICAgIHZhbHVlOiBtLnRvdGFsQmxvY2tlZEF0dGVtcHRzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LnVuaXF1ZV92ZWN0b3JzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGRpc3RpbmN0IGF0dGFjayB2ZWN0b3JzIG9ic2VydmVkJyxcbiAgICAgICAgICB2YWx1ZTogbS51bmlxdWVBdHRhY2tWZWN0b3JzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LmJsb2NrZWRfYnlfc2V2ZXJpdHknLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdCbG9ja2VkIGF0dGFja3MgYnJva2VuIGRvd24gYnkgc2V2ZXJpdHknLFxuICAgICAgICAgIGxhYmVsczogeyBzZXZlcml0eTogJ2NyaXRpY2FsJyB9LFxuICAgICAgICAgIHZhbHVlOiBtLmNyaXRpY2FsQXR0YWNrc0Jsb2NrZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF9ieV9zZXZlcml0eScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYXR0YWNrcyBicm9rZW4gZG93biBieSBzZXZlcml0eScsXG4gICAgICAgICAgbGFiZWxzOiB7IHNldmVyaXR5OiAnaGlnaCcgfSxcbiAgICAgICAgICB2YWx1ZTogbS5oaWdoU2V2ZXJpdHlCbG9ja2VkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc2VjdXJpdHkudGVsZW1ldHJ5LmJsb2NrZWRfYnlfc2V2ZXJpdHknLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdCbG9ja2VkIGF0dGFja3MgYnJva2VuIGRvd24gYnkgc2V2ZXJpdHknLFxuICAgICAgICAgIGxhYmVsczogeyBzZXZlcml0eTogJ21lZGl1bScgfSxcbiAgICAgICAgICB2YWx1ZTogbS5tZWRpdW1TZXZlcml0eUJsb2NrZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuYmxvY2tlZF9ieV9zZXZlcml0eScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYXR0YWNrcyBicm9rZW4gZG93biBieSBzZXZlcml0eScsXG4gICAgICAgICAgbGFiZWxzOiB7IHNldmVyaXR5OiAnbG93JyB9LFxuICAgICAgICAgIHZhbHVlOiBtLmxvd1NldmVyaXR5QmxvY2tlZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3NlY3VyaXR5LnRlbGVtZXRyeS5hdHRhY2tzX3Blcl9ob3VyJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQXR0YWNrIGF0dGVtcHRzIHJlY29yZGVkIGluIHRoZSBjdXJyZW50IGNsb2NrIGhvdXInLFxuICAgICAgICAgIHZhbHVlOiBhdHRhY2tzVGhpc0hvdXIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuZGVkdXBfc3VwcHJlc3NlZCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlcGVhdGVkIGV2ZW50cyBzdXBwcmVzc2VkIGJ5IGRlZHVwbGljYXRpb24nLFxuICAgICAgICAgIHZhbHVlOiBtLmRlZHVwbGljYXRpb24uc3VwcHJlc3NlZEV2ZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3NlY3VyaXR5LnRlbGVtZXRyeS5kZWR1cF91bmlxdWUnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdVbmlxdWUgZXZlbnRzIHRoYXQgcGFzc2VkIHRocm91Z2ggZGVkdXBsaWNhdGlvbicsXG4gICAgICAgICAgdmFsdWU6IG0uZGVkdXBsaWNhdGlvbi51bmlxdWVFdmVudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzZWN1cml0eS50ZWxlbWV0cnkuZGVkdXBfY2FjaGVfc2l6ZScsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgZGVkdXBsaWNhdGlvbiBjYWNoZSBzaXplJyxcbiAgICAgICAgICB2YWx1ZTogbS5kZWR1cGxpY2F0aW9uLmNhY2hlU2l6ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufVxuIl19