{% from "components.html" import dot %} {% set mcp_base = base ~ "/mcp" %}

MCP POLICY

{% if mcp_gate.policy_id %} Open policy {% endif %}
Policy
{% if mcp_gate.policy_id %} {{ mcp_gate.policy_name }} {% endif %} {{ mcp_gate.policy_tag[0] }} {% if mcp_gate.edited_from %} edited from {{ mcp_gate.edited_from }} {% endif %}
Configured
{{ mcp_gate.configured }}
Rules
{{ mcp_gate.rules_line }} Show rules
Servers
{% for name, external in mcp_gate.servers %} {% if external %} {{ name }} {% else %} {{ name }} {% endif %} {% else %} none {% endfor %}
Changed live
{{ mcp_gate.changed }}
{% for tile in mcp_gate.tiles %}
{{ tile.label | upper }}
{% if tile.tone and tile.counted %}{{ dot(tile.tone) }}{% endif %} {{ tile.value }}
{{ tile.note }} {% if loop.last and tile.counted %} Open secrets {% endif %}
{% endfor %}
{% if not mcp_gate.started %}
The Run has not started The runner configures the MCP broker when it starts the VM. Calls show here from then on.
{% else %} {% set line = mcp_gate.timeline %}

MCP OVER THE RUN

{{ line.span }} · bars are calls per minute · a marker opens its events
{% for marker in line.markers %} {{ marker.label }} {% endfor %}
policy
{% for segment in line.segments %} {{ segment.label }} {% endfor %}
{% for lane in line.lanes %}
{% if lane.link %} {{ lane.server }} {% else %} {{ lane.server }} {% endif %}
{% for span in lane.spans %} {% endfor %} {% for bar in lane.bars %} {% endfor %}
{% endfor %}
{% for tick in line.axis %}{{ tick }}{% endfor %}
GATE EVENTS · {{ mcp_gate.events | length }} mcp_policy_configured · mcp_attached · mcp_rejected · mcp_credentials_updated · policy_changed
{% for event in mcp_gate.events %} {% else %} {% endfor %}
{{ event.number }} {{ event.time }} {{ event.event }} {% if event.before %} {{ event.before }} → {{ event.after }} {% endif %} {{ event.detail }} {% for name in event.names %}{{ name }}{% endfor %} {{ event.actor }}
No gate event yet.
{% if mcp_gate.budgets %}

RULE BUDGETS · {{ mcp_gate.budgets | length }}

a denied call spends nothing · a rule kept across a change keeps what it spent
{% for budget in mcp_gate.budgets %} {% endfor %}
RULE SERVER TOOL BUDGET SPENT NOTE
rule {{ budget.rule }} {% if budget.link %} {{ budget.server }} {% else %} {{ budget.server }} {% endif %} {{ budget.tool }} {% if budget.constraint %}{{ budget.constraint }}{% endif %} {{ budget.limit }} {{ budget.spent }} {% if budget.refused %} {{ budget.refused }} refused {% endif %} {% if budget.since %} since {{ budget.since }} · a new rule starts at 0 {% elif not budget.refused %} — {% endif %}
{% endif %} {% if not mcp_gate.groups %}
No call yet The agent has not called a tool or read a resource through the broker. Calls, denials and the budgets they spend show here from the first one.
{% else %}

CALLS BY SERVER AND TOOL · {{ mcp_gate.groups_total }}

denied first · grouped by server, tool and resource
{% for group in mcp_gate.groups %} {% endfor %}
SERVER TOOL / RESOURCE CALLS DENIED SLOWEST LAST CALL
{% if group.link %} {{ group.server }} {% else %} {{ group.server }} {% endif %} {{ group.tool }} {% if group.resource %}{{ group.resource }}{% endif %} {{ group.calls }} {{ group.denied }} {{ group.slowest }} {{ group.last }}
{% include "partials/gates_mcp_calls.html" %} {% endif %} {% endif %}