from aevyra_witness.runtime import span, trace as witness_trace
from aevyra_witness.interceptors import wrap_mcp_session
@span("plan", optimize=True, prompt_id="planner_v1")
async def plan(context: str) -> str: ...
async def run_agent(question: str):
with witness_trace() as tracer:
async with ClientSession(read, write) as session:
await session.initialize()
# Attach tracer — MCP spans are injected automatically
mcp = wrap_mcp_session(session, server_name="stripe", tracer=tracer)
plan_result = await plan(question)
charge = await mcp.call_tool("get_charge", {"id": "ch_123"})
# ...
# trace contains both @span and MCP spans in execution order
return tracer.finish()