{% from "partials/mcp_cards.html" import rule_list %}

MCP

{% if mcp.policy_id %} Open policy {% endif %} {% if mcp.changeable %} Change MCP policy {% endif %}
Policy
{% if mcp.policy_id %} {{ mcp.policy }} {% else %} temporary this Run only{% if mcp.edited_from %} · edited from {{ mcp.edited_from }}{% endif %} {% endif %}
Created with
{% if mcp.created_id %} {{ mcp.created }} {% else %} {{ mcp.created }} {% endif %}
Rules
{{ mcp.rules_line }}
Calls
{{ mcp.calls }}
Secrets granted
{% for name in mcp.grants %} {{ name }} {% else %} none {% endfor %}
Secret reads
{{ mcp.reads }}
Applied by the runner
{{ mcp.applied }}

SERVERS HELD NOW · {{ mcp.servers | length }} the Run's own copy of the catalog

    {% for server in mcp.servers %}
  • {{ server.name }} {{ "external" if server.external else "built-in" }} {% if server.added %}added {{ server.added }}{% endif %}
    {{ server.url }}
    {% if server.credential %} {{ server.credential }} {% endif %} {{ server.limits }}
  • {% endfor %}
Show rules {{ rule_list(mcp.rules) }}

POLICY HISTORY · {{ mcp.history | length }} {{ "CHANGE" if mcp.history | length == 1 else "CHANGES" }}

A change is swapped in between two calls: a call in flight ends under the policy it started with, and the agent is told to list its tools again. A server taken away loses its credential on the runner with the same pass.