Skip to main content
Glama
link0-o

PerfLens MCP Server

by link0-o

get_hotspot_details

Read-onlyIdempotent

Retrieve detailed information about a specific hotspot, including dominant call paths, classifications, and configured limits, to support performance analysis.

Instructions

Return one hotspot with bounded dominant paths, classifications, and limits.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
hotspot_idYes
analysis_idYes
call_path_limitNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hotspotYes
analysis_idYes
limitationsYes
schema_versionNo1.0
classificationsYes
evidence_qualityYes
dominant_call_pathsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changedv0.3.2
    • addedOutput schema / $defs / EvidenceQuality / properties / kernel_context_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Kernel Context Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / kernel_context_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Kernel Context Self Weight"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unknown_context_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unknown Context Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unknown_context_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unknown Context Self Weight"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_kernel_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved Kernel Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_kernel_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved Kernel Self Weight"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_unknown_context_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved Unknown Context Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_unknown_context_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved Unknown Context Self Weight"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_user_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved User Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / unresolved_user_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Unresolved User Self Weight"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / user_context_self_percent
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "User Context Self Percent"
      +}
    • addedOutput schema / $defs / EvidenceQuality / properties / user_context_self_weight
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "User Context Self Weight"
      +}
  2. Changed13 schema fields changedv0.3.0
    • addedOutput schema / $defs / CallPathFrame / properties / normalization_merged
      Added value: +{
      +  "default": false,
      +  "title": "Normalization Merged",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / CallPathFrame / properties / symbol_variant_count
      Added value: +{
      +  "description": "Exact raw-symbol variant count when symbol_variants_truncated is false; otherwise a conservative observed lower bound",
      +  "minimum": 1,
      +  "title": "Symbol Variant Count",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / CallPathFrame / properties / symbol_variants_truncated
      Added value: +{
      +  "default": false,
      +  "title": "Symbol Variants Truncated",
      +  "type": "boolean"
      +}
    • changedOutput schema / $defs / CallPathFrame / required
      Previous value: -[
      -  "symbol",
      -  "dso"
      -]New value: +[
      +  "symbol",
      +  "dso",
      +  "symbol_variant_count"
      +]
    • addedOutput schema / $defs / EvidenceQuality
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "actual_event_source": {
      +      "default": "unknown",
      +      "enum": [
      +        "hardware",
      +        "software",
      +        "unknown"
      +      ],
      +      "title": "Actual Event Source",
      +      "type": "string"
      +    },
      +    "address_annotation_line_count": {
      +      "minimum": 0,
      +      "title": "Address Annotation Line Count",
      +      "type": "integer"
      +    },
      +    "aggregated_frame_occurrence_count": {
      +      "minimum": 0,
      +      "title": "Aggregated Frame Occurrence Count",
      +      "type": "integer"
      +    },
      +    "allowed_conclusions": {
      +      "default": [],
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Allowed Conclusions",
      +      "type": "array"
      +    },
      +    "call_graph_weight": {
      +      "minimum": 0,
      +      "title": "Call Graph Weight",
      +      "type": "integer"
      +    },
      +    "call_graph_weight_percent": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "title": "Call Graph Weight Percent",
      +      "type": "number"
      +    },
      +    "collection_limitations": {
      +      "default": [],
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Collection Limitations",
      +      "type": "array"
      +    },
      +    "duplicate_frame_line_count": {
      +      "minimum": 0,
      +      "title": "Duplicate Frame Line Count",
      +      "type": "integer"
      +    },
      +    "event": {
      +      "title": "Event",
      +      "type": "string"
      +    },
      +    "exported_call_path_count": {
      +      "minimum": 0,
      +      "title": "Exported Call Path Count",
      +      "type": "integer"
      +    },
      +    "exported_hotspot_count": {
      +      "minimum": 0,
      +      "title": "Exported Hotspot Count",
      +      "type": "integer"
      +    },
      +    "fallback_reason": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Fallback Reason"
      +    },
      +    "fallback_used": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Fallback Used"
      +    },
      +    "forbidden_conclusions": {
      +      "default": [],
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Forbidden Conclusions",
      +      "type": "array"
      +    },
      +    "frame_line_count": {
      +      "minimum": 0,
      +      "title": "Frame Line Count",
      +      "type": "integer"
      +    },
      +    "inline_frame_count": {
      +      "minimum": 0,
      +      "title": "Inline Frame Count",
      +      "type": "integer"
      +    },
      +    "input_bytes": {
      +      "minimum": 0,
      +      "title": "Input Bytes",
      +      "type": "integer"
      +    },
      +    "input_sha256": {
      +      "pattern": "^[a-f0-9]{64}$",
      +      "title": "Input Sha256",
      +      "type": "string"
      +    },
      +    "limitations": {
      +      "default": [],
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Limitations",
      +      "type": "array"
      +    },
      +    "malformed_record_count": {
      +      "minimum": 0,
      +      "title": "Malformed Record Count",
      +      "type": "integer"
      +    },
      +    "normalization_merge_count": {
      +      "minimum": 0,
      +      "title": "Normalization Merge Count",
      +      "type": "integer"
      +    },
      +    "omitted_call_path_weight": {
      +      "minimum": 0,
      +      "title": "Omitted Call Path Weight",
      +      "type": "integer"
      +    },
      +    "omitted_hotspot_self_weight": {
      +      "minimum": 0,
      +      "title": "Omitted Hotspot Self Weight",
      +      "type": "integer"
      +    },
      +    "parser_invariants_passed": {
      +      "title": "Parser Invariants Passed",
      +      "type": "boolean"
      +    },
      +    "quality_status": {
      +      "enum": [
      +        "verified",
      +        "partial"
      +      ],
      +      "title": "Quality Status",
      +      "type": "string"
      +    },
      +    "sample_count": {
      +      "minimum": 0,
      +      "title": "Sample Count",
      +      "type": "integer"
      +    },
      +    "schema_version": {
      +      "const": "1.0",
      +      "default": "1.0",
      +      "title": "Schema Version",
      +      "type": "string"
      +    },
      +    "source_annotation_line_count": {
      +      "minimum": 0,
      +      "title": "Source Annotation Line Count",
      +      "type": "integer"
      +    },
      +    "source_collection_artifact_sha256": {
      +      "anyOf": [
      +        {
      +          "pattern": "^[a-f0-9]{64}$",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Source Collection Artifact Sha256"
      +    },
      +    "source_collection_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Source Collection Id"
      +    },
      +    "source_line_frame_count": {
      +      "minimum": 0,
      +      "title": "Source Line Frame Count",
      +      "type": "integer"
      +    },
      +    "source_line_self_percent": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "title": "Source Line Self Percent",
      +      "type": "number"
      +    },
      +    "source_line_self_weight": {
      +      "minimum": 0,
      +      "title": "Source Line Self Weight",
      +      "type": "integer"
      +    },
      +    "source_locations_truncated_hotspot_count": {
      +      "minimum": 0,
      +      "title": "Source Locations Truncated Hotspot Count",
      +      "type": "integer"
      +    },
      +    "total_call_path_count": {
      +      "minimum": 0,
      +      "title": "Total Call Path Count",
      +      "type": "integer"
      +    },
      +    "total_hotspot_count": {
      +      "minimum": 0,
      +      "title": "Total Hotspot Count",
      +      "type": "integer"
      +    },
      +    "total_weight": {
      +      "minimum": 0,
      +      "title": "Total Weight",
      +      "type": "integer"
      +    },
      +    "unicode_replacement_count": {
      +      "minimum": 0,
      +      "title": "Unicode Replacement Count",
      +      "type": "integer"
      +    },
      +    "unresolved_self_percent": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "title": "Unresolved Self Percent",
      +      "type": "number"
      +    },
      +    "unresolved_self_weight": {
      +      "minimum": 0,
      +      "title": "Unresolved Self Weight",
      +      "type": "integer"
      +    },
      +    "warning_count": {
      +      "minimum": 0,
      +      "title": "Warning Count",
      +      "type": "integer"
      +    },
      +    "warnings_truncated": {
      +      "title": "Warnings Truncated",
      +      "type": "boolean"
      +    },
      +    "weight_source": {
      +      "title": "Weight Source",
      +      "type": "string"
      +    },
      +    "weight_unit": {
      +      "title": "Weight Unit",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "quality_status",
      +    "parser_invariants_passed",
      +    "input_sha256",
      +    "input_bytes",
      +    "sample_count",
      +    "total_weight",
      +    "event",
      +    "weight_unit",
      +    "weight_source",
      +    "malformed_record_count",
      +    "warning_count",
      +    "warnings_truncated",
      +    "unicode_replacement_count",
      +    "frame_line_count",
      +    "duplicate_frame_line_count",
      +    "address_annotation_line_count",
      +    "source_annotation_line_count",
      +    "aggregated_frame_occurrence_count",
      +    "unresolved_self_weight",
      +    "unresolved_self_percent",
      +    "call_graph_weight",
      +    "call_graph_weight_percent",
      +    "source_line_frame_count",
      +    "source_line_self_weight",
      +    "source_line_self_percent",
      +    "inline_frame_count",
      +    "normalization_merge_count",
      +    "source_locations_truncated_hotspot_count",
      +    "total_hotspot_count",
      +    "exported_hotspot_count",
      +    "omitted_hotspot_self_weight",
      +    "total_call_path_count",
      +    "exported_call_path_count",
      +    "omitted_call_path_weight"
      +  ],
      +  "title": "EvidenceQuality",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / Hotspot / properties / normalization_merged
      Added value: +{
      +  "default": false,
      +  "title": "Normalization Merged",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / Hotspot / properties / source_locations_truncated
      Added value: +{
      +  "default": false,
      +  "title": "Source Locations Truncated",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / Hotspot / properties / symbol_variant_count
      Added value: +{
      +  "description": "Exact raw-symbol variant count when symbol_variants_truncated is false; otherwise a conservative observed lower bound",
      +  "minimum": 0,
      +  "title": "Symbol Variant Count",
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / Hotspot / properties / symbol_variants
      Added value: +{
      +  "default": [],
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Symbol Variants",
      +  "type": "array"
      +}
    • addedOutput schema / $defs / Hotspot / properties / symbol_variants_truncated
      Added value: +{
      +  "default": false,
      +  "title": "Symbol Variants Truncated",
      +  "type": "boolean"
      +}
    • changedOutput schema / $defs / Hotspot / required
      Previous value: -[
      -  "hotspot_id",
      -  "symbol",
      -  "dso",
      -  "self_weight",
      -  "inclusive_weight",
      -  "sample_count",
      -  "stack_occurrence_count",
      -  "self_percent",
      -  "inclusive_percent",
      -  "thread_count"
      -]New value: +[
      +  "hotspot_id",
      +  "symbol",
      +  "dso",
      +  "self_weight",
      +  "inclusive_weight",
      +  "sample_count",
      +  "stack_occurrence_count",
      +  "self_percent",
      +  "inclusive_percent",
      +  "thread_count",
      +  "symbol_variant_count"
      +]
    • addedOutput schema / properties / evidence_quality
      Added value: +{
      +  "$ref": "#/$defs/EvidenceQuality"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "analysis_id",
      -  "hotspot",
      -  "dominant_call_paths",
      -  "classifications",
      -  "limitations"
      -]New value: +[
      +  "analysis_id",
      +  "evidence_quality",
      +  "hotspot",
      +  "dominant_call_paths",
      +  "classifications",
      +  "limitations"
      +]
  3. First observedv0.1.0

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds 'bounded dominant paths' and 'limits', hinting at output size constraints, but it is vague and doesn't specify how call_path_limit affects the returned data.

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

Conciseness4/5

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

The description is a single sentence with no wasted words and places the core purpose first. However, its brevity sacrifices important semantic detail, making it under-specified rather than appropriately concise.

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

Completeness3/5

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

Output schema and annotations fill in return shape and safety, but the description leaves usage context and parameter semantics largely open. For a simple 3-parameter read-only tool this is a minimally viable definition, but it still has clear gaps in guidance and parameter clarity.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only alludes to 'limits' without explaining analysis_id, hotspot_id, or call_path_limit. These parameter roles are not described with enough clarity for an agent to confidently populate them.

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

Purpose4/5

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

The description states a specific verb ('Return'), a specific resource ('one hotspot'), and the content the caller receives, but it doesn't explicitly differentiate this from siblings like list_hotspots or get_call_paths beyond the singular scope.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs alternatives. It never mentions list_hotspots, get_call_paths, classify_hotspots, or any prerequisite analysis step, leaving the agent to infer usage from the name alone.

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