cai/ref/mcp/server/index.html

5541 lines
214 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="../../../assets/imago.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11">
<title>MCP Servers - CAI</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.4af4bdda.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/_mkdocstrings.css">
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#mcp-servers" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="CAI" class="md-header__button md-logo" aria-label="CAI" data-md-component="logo">
<img src="../../../assets/imago.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
CAI
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
MCP Servers
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/aliasrobotics/cai" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
aliasrobotics/cai
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="CAI" class="md-nav__button md-logo" aria-label="CAI" data-md-component="logo">
<img src="../../../assets/imago.png" alt="logo">
</a>
CAI
</label>
<div class="md-nav__source">
<a href="https://github.com/aliasrobotics/cai" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
aliasrobotics/cai
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_1" >
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Welcome
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai_installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai_quickstart/" class="md-nav__link">
<span class="md-ellipsis">
Quickstart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai_list_of_models/" class="md-nav__link">
<span class="md-ellipsis">
Available Models
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_1_5" >
<label class="md-nav__link" for="__nav_1_5" id="__nav_1_5_label" tabindex="0">
<span class="md-ellipsis">
Model Providers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_1_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1_5">
<span class="md-nav__icon md-icon"></span>
Model Providers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../providers/openrouter.md" class="md-nav__link">
<span class="md-ellipsis">
OpenRouter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../providers/ollama/" class="md-nav__link">
<span class="md-ellipsis">
Ollama
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../providers/azure.md" class="md-nav__link">
<span class="md-ellipsis">
Azure OpenAI
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../../cai_pro/" class="md-nav__link">
<span class="md-ellipsis">
🚀 CAI PRO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Core Concepts
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Core Concepts
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../cai_architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../agents/" class="md-nav__link">
<span class="md-ellipsis">
Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tools/" class="md-nav__link">
<span class="md-ellipsis">
Tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../handoffs/" class="md-nav__link">
<span class="md-ellipsis">
Handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../multi_agent/" class="md-nav__link">
<span class="md-ellipsis">
Multi-Agent Systems
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Benchmarking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Benchmarking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../benchmarking/overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/running_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Running Benchmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/attack_defense/" class="md-nav__link">
<span class="md-ellipsis">
Attack & Defense CTFs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/jeopardy_ctfs/" class="md-nav__link">
<span class="md-ellipsis">
Jeopardy CTFs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/cyber_ranges/" class="md-nav__link">
<span class="md-ellipsis">
Cyber Ranges
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/knowledge_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Knowledge Benchmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../benchmarking/privacy_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Privacy Benchmarks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Guides
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../running_agents/" class="md-nav__link">
<span class="md-ellipsis">
Running Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../continue_mode/" class="md-nav__link">
<span class="md-ellipsis">
Continue Mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../results/" class="md-nav__link">
<span class="md-ellipsis">
Working with Results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../streaming/" class="md-nav__link">
<span class="md-ellipsis">
Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tracing/" class="md-nav__link">
<span class="md-ellipsis">
Tracing & Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../context/" class="md-nav__link">
<span class="md-ellipsis">
Context Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guardrails/" class="md-nav__link">
<span class="md-ellipsis">
Guardrails & Security
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../environment_variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai/getting-started/packet_capture_wsl/" class="md-nav__link">
<span class="md-ellipsis">
Packet Capture on WSL2
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Troubleshooting
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Troubleshooting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../cai/troubleshooting/operator_feedback_reproduction/" class="md-nav__link">
<span class="md-ellipsis">
Operator Feedback Reproduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai/troubleshooting/platform_limitations/" class="md-nav__link">
<span class="md-ellipsis">
Platform Limitations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
<span class="md-ellipsis">
Case Studies
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Case Studies
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../cai/case-studies/operator-artifact-evidence/" class="md-nav__link">
<span class="md-ellipsis">
Operator Artifact Evidence
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
<span class="md-ellipsis">
Mobile UI (iOS)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Mobile UI (iOS)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../mui/mui_index/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../mui/getting_started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../mui/user_interface/" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../mui/gestures_shortcuts/" class="md-nav__link">
<span class="md-ellipsis">
Gestures & Shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../mui/chat_features/" class="md-nav__link">
<span class="md-ellipsis">
Chat Features
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
<span class="md-ellipsis">
Terminal UI (TUI) - Deprecated
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
Terminal UI (TUI) - Deprecated
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../tui/tui_index/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/getting_started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/user_interface/" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/terminals_management/" class="md-nav__link">
<span class="md-ellipsis">
Terminals Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/teams_and_parallel_execution/" class="md-nav__link">
<span class="md-ellipsis">
Teams & Parallel Execution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/sidebar_features/" class="md-nav__link">
<span class="md-ellipsis">
Sidebar Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/keyboard_shortcuts/" class="md-nav__link">
<span class="md-ellipsis">
Keyboard Shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/commands_reference/" class="md-nav__link">
<span class="md-ellipsis">
Commands Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/advanced_features/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../tui/troubleshooting/" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10" >
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_1" >
<label class="md-nav__link" for="__nav_10_1" id="__nav_10_1_label" tabindex="0">
<span class="md-ellipsis">
Agents
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_1">
<span class="md-nav__icon md-icon"></span>
Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../agent/" class="md-nav__link">
<span class="md-ellipsis">
Agent
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../run/" class="md-nav__link">
<span class="md-ellipsis">
Runner
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tool/" class="md-nav__link">
<span class="md-ellipsis">
Tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../result/" class="md-nav__link">
<span class="md-ellipsis">
Result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../stream_events/" class="md-nav__link">
<span class="md-ellipsis">
Stream Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../handoffs/" class="md-nav__link">
<span class="md-ellipsis">
Handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../lifecycle/" class="md-nav__link">
<span class="md-ellipsis">
Lifecycle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../items/" class="md-nav__link">
<span class="md-ellipsis">
Items
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../run_context/" class="md-nav__link">
<span class="md-ellipsis">
Run Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../usage/" class="md-nav__link">
<span class="md-ellipsis">
Usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../exceptions/" class="md-nav__link">
<span class="md-ellipsis">
Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../guardrail/" class="md-nav__link">
<span class="md-ellipsis">
Guardrail
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../model_settings/" class="md-nav__link">
<span class="md-ellipsis">
Model Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agent_output/" class="md-nav__link">
<span class="md-ellipsis">
Agent Output
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../function_schema/" class="md-nav__link">
<span class="md-ellipsis">
Function Schema
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_2" >
<label class="md-nav__link" for="__nav_10_2" id="__nav_10_2_label" tabindex="0">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_2">
<span class="md-nav__icon md-icon"></span>
Models
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/interface/" class="md-nav__link">
<span class="md-ellipsis">
Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../models/openai_chatcompletions/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Chat Completions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../models/openai_responses/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Responses
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_3" >
<label class="md-nav__link" for="__nav_10_3" id="__nav_10_3_label" tabindex="0">
<span class="md-ellipsis">
Extensions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_3">
<span class="md-nav__icon md-icon"></span>
Extensions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../extensions/handoff_filters/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Filters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../extensions/handoff_prompt/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Prompt
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../cai_development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="">
<span class="md-ellipsis">
Research
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
Research
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../research/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_13" >
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="">
<span class="md-ellipsis">
Resources
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
Resources
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../cai_faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai_find_us/" class="md-nav__link">
<span class="md-ellipsis">
Find Us
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../cai_citation_and_acknowledgments/" class="md-nav__link">
<span class="md-ellipsis">
Citation & Acknowledgments
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server" class="md-nav__link">
<span class="md-ellipsis">
server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer" class="md-nav__link">
<span class="md-ellipsis">
MCPServer
</span>
</a>
<nav class="md-nav" aria-label="MCPServer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer.name" class="md-nav__link">
<span class="md-ellipsis">
name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer.connect" class="md-nav__link">
<span class="md-ellipsis">
connect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer.cleanup" class="md-nav__link">
<span class="md-ellipsis">
cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer.list_tools" class="md-nav__link">
<span class="md-ellipsis">
list_tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServer.call_tool" class="md-nav__link">
<span class="md-ellipsis">
call_tool
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams" class="md-nav__link">
<span class="md-ellipsis">
MCPServerStdioParams
</span>
</a>
<nav class="md-nav" aria-label="MCPServerStdioParams">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.command" class="md-nav__link">
<span class="md-ellipsis">
command
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.args" class="md-nav__link">
<span class="md-ellipsis">
args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.cwd" class="md-nav__link">
<span class="md-ellipsis">
cwd
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.encoding" class="md-nav__link">
<span class="md-ellipsis">
encoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdioParams.encoding_error_handler" class="md-nav__link">
<span class="md-ellipsis">
encoding_error_handler
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio" class="md-nav__link">
<span class="md-ellipsis">
MCPServerStdio
</span>
</a>
<nav class="md-nav" aria-label="MCPServerStdio">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.name" class="md-nav__link">
<span class="md-ellipsis">
name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.create_streams" class="md-nav__link">
<span class="md-ellipsis">
create_streams
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.connect" class="md-nav__link">
<span class="md-ellipsis">
connect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.cleanup" class="md-nav__link">
<span class="md-ellipsis">
cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.list_tools" class="md-nav__link">
<span class="md-ellipsis">
list_tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.call_tool" class="md-nav__link">
<span class="md-ellipsis">
call_tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerStdio.invalidate_tools_cache" class="md-nav__link">
<span class="md-ellipsis">
invalidate_tools_cache
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSseParams" class="md-nav__link">
<span class="md-ellipsis">
MCPServerSseParams
</span>
</a>
<nav class="md-nav" aria-label="MCPServerSseParams">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSseParams.url" class="md-nav__link">
<span class="md-ellipsis">
url
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSseParams.headers" class="md-nav__link">
<span class="md-ellipsis">
headers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSseParams.timeout" class="md-nav__link">
<span class="md-ellipsis">
timeout
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSseParams.sse_read_timeout" class="md-nav__link">
<span class="md-ellipsis">
sse_read_timeout
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse" class="md-nav__link">
<span class="md-ellipsis">
MCPServerSse
</span>
</a>
<nav class="md-nav" aria-label="MCPServerSse">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.name" class="md-nav__link">
<span class="md-ellipsis">
name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.create_streams" class="md-nav__link">
<span class="md-ellipsis">
create_streams
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.cleanup" class="md-nav__link">
<span class="md-ellipsis">
cleanup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.connect" class="md-nav__link">
<span class="md-ellipsis">
connect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.list_tools" class="md-nav__link">
<span class="md-ellipsis">
list_tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.call_tool" class="md-nav__link">
<span class="md-ellipsis">
call_tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.mcp.server.MCPServerSse.invalidate_tools_cache" class="md-nav__link">
<span class="md-ellipsis">
invalidate_tools_cache
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="mcp-servers"><code>MCP Servers</code></h1>
<div class="doc doc-object doc-module">
<a id="cai.sdk.agents.mcp.server"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.mcp.server.MCPServer" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MCPServer</span>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="abc.ABC">ABC</span></code></p>
<p>Base class for Model Context Protocol servers.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span>
<span class="normal">52</span>
<span class="normal">53</span>
<span class="normal">54</span>
<span class="normal">55</span>
<span class="normal">56</span>
<span class="normal">57</span>
<span class="normal">58</span>
<span class="normal">59</span>
<span class="normal">60</span>
<span class="normal">61</span>
<span class="normal">62</span>
<span class="normal">63</span>
<span class="normal">64</span>
<span class="normal">65</span>
<span class="normal">66</span>
<span class="normal">67</span>
<span class="normal">68</span>
<span class="normal">69</span>
<span class="normal">70</span>
<span class="normal">71</span>
<span class="normal">72</span>
<span class="normal">73</span>
<span class="normal">74</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-42"><span class="k">class</span><span class="w"> </span><span class="nc">MCPServer</span><span class="p">(</span><span class="n">abc</span><span class="o">.</span><span class="n">ABC</span><span class="p">):</span>
</span><span id="__span-0-43"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Base class for Model Context Protocol servers.&quot;&quot;&quot;</span>
</span><span id="__span-0-44">
</span><span id="__span-0-45"> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-46"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-47"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Connect to the server. For example, this might mean spawning a subprocess or</span>
</span><span id="__span-0-48"><span class="sd"> opening a network connection. The server is expected to remain connected until</span>
</span><span id="__span-0-49"><span class="sd"> `cleanup()` is called.</span>
</span><span id="__span-0-50"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-51"> <span class="k">pass</span>
</span><span id="__span-0-52">
</span><span id="__span-0-53"> <span class="nd">@property</span>
</span><span id="__span-0-54"> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-55"> <span class="k">def</span><span class="w"> </span><span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="__span-0-56"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A readable name for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-57"> <span class="k">pass</span>
</span><span id="__span-0-58">
</span><span id="__span-0-59"> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-60"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-61"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the server. For example, this might mean closing a subprocess or</span>
</span><span id="__span-0-62"><span class="sd"> closing a network connection.</span>
</span><span id="__span-0-63"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-64"> <span class="k">pass</span>
</span><span id="__span-0-65">
</span><span id="__span-0-66"> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-67"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">list_tools</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">MCPTool</span><span class="p">]:</span>
</span><span id="__span-0-68"><span class="w"> </span><span class="sd">&quot;&quot;&quot;List the tools available on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-69"> <span class="k">pass</span>
</span><span id="__span-0-70">
</span><span id="__span-0-71"> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-72"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">call_tool</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tool_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">CallToolResult</span><span class="p">:</span>
</span><span id="__span-0-73"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invoke a tool on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-74"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServer.name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">name</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A readable name for the server.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServer.connect" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">connect</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">connect</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Connect to the server. For example, this might mean spawning a subprocess or
opening a network connection. The server is expected to remain connected until
<code>cleanup()</code> is called.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-45"><span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-46"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-47"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Connect to the server. For example, this might mean spawning a subprocess or</span>
</span><span id="__span-0-48"><span class="sd"> opening a network connection. The server is expected to remain connected until</span>
</span><span id="__span-0-49"><span class="sd"> `cleanup()` is called.</span>
</span><span id="__span-0-50"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-51"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServer.cleanup" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">cleanup</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">cleanup</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Cleanup the server. For example, this might mean closing a subprocess or
closing a network connection.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">59</span>
<span class="normal">60</span>
<span class="normal">61</span>
<span class="normal">62</span>
<span class="normal">63</span>
<span class="normal">64</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-59"><span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-60"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-61"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the server. For example, this might mean closing a subprocess or</span>
</span><span id="__span-0-62"><span class="sd"> closing a network connection.</span>
</span><span id="__span-0-63"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-64"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServer.list_tools" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">list_tools</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">list_tools</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" href="../../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><span title="mcp.types.Tool">Tool</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>List the tools available on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">66</span>
<span class="normal">67</span>
<span class="normal">68</span>
<span class="normal">69</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-66"><span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-67"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">list_tools</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">MCPTool</span><span class="p">]:</span>
</span><span id="__span-0-68"><span class="w"> </span><span class="sd">&quot;&quot;&quot;List the tools available on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-69"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServer.call_tool" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">call_tool</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">call_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">tool_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="typing.Any">Any</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="__span-0-3"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="mcp.types.CallToolResult">CallToolResult</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Invoke a tool on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">71</span>
<span class="normal">72</span>
<span class="normal">73</span>
<span class="normal">74</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-71"><span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
</span><span id="__span-0-72"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">call_tool</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tool_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">CallToolResult</span><span class="p">:</span>
</span><span id="__span-0-73"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invoke a tool on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-74"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.mcp.server.MCPServerStdioParams" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MCPServerStdioParams</span>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="typing_extensions.TypedDict">TypedDict</span></code></p>
<p>Mirrors <code>mcp.client.stdio.StdioServerParameters</code>, but lets you pass params without another
import.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">207</span>
<span class="normal">208</span>
<span class="normal">209</span>
<span class="normal">210</span>
<span class="normal">211</span>
<span class="normal">212</span>
<span class="normal">213</span>
<span class="normal">214</span>
<span class="normal">215</span>
<span class="normal">216</span>
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span>
<span class="normal">233</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-207"><span class="k">class</span><span class="w"> </span><span class="nc">MCPServerStdioParams</span><span class="p">(</span><span class="n">TypedDict</span><span class="p">):</span>
</span><span id="__span-0-208"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Mirrors `mcp.client.stdio.StdioServerParameters`, but lets you pass params without another</span>
</span><span id="__span-0-209"><span class="sd"> import.</span>
</span><span id="__span-0-210"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-211">
</span><span id="__span-0-212"> <span class="n">command</span><span class="p">:</span> <span class="nb">str</span>
</span><span id="__span-0-213"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The executable to run to start the server. For example, `python` or `node`.&quot;&quot;&quot;</span>
</span><span id="__span-0-214">
</span><span id="__span-0-215"> <span class="n">args</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
</span><span id="__span-0-216"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Command line args to pass to the `command` executable. For example, `[&#39;foo.py&#39;]` or</span>
</span><span id="__span-0-217"><span class="sd"> `[&#39;server.js&#39;, &#39;--port&#39;, &#39;8080&#39;]`.&quot;&quot;&quot;</span>
</span><span id="__span-0-218">
</span><span id="__span-0-219"> <span class="n">env</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]</span>
</span><span id="__span-0-220"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The environment variables to set for the server. .&quot;&quot;&quot;</span>
</span><span id="__span-0-221">
</span><span id="__span-0-222"> <span class="n">cwd</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">Path</span><span class="p">]</span>
</span><span id="__span-0-223"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The working directory to use when spawning the process.&quot;&quot;&quot;</span>
</span><span id="__span-0-224">
</span><span id="__span-0-225"> <span class="n">encoding</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>
</span><span id="__span-0-226"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The text encoding used when sending/receiving messages to the server. Defaults to `utf-8`.&quot;&quot;&quot;</span>
</span><span id="__span-0-227">
</span><span id="__span-0-228"> <span class="n">encoding_error_handler</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;strict&quot;</span><span class="p">,</span> <span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="s2">&quot;replace&quot;</span><span class="p">]]</span>
</span><span id="__span-0-229"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The text encoding error handler. Defaults to `strict`.</span>
</span><span id="__span-0-230">
</span><span id="__span-0-231"><span class="sd"> See https://docs.python.org/3/library/codecs.html#codec-base-classes for</span>
</span><span id="__span-0-232"><span class="sd"> explanations of possible values.</span>
</span><span id="__span-0-233"><span class="sd"> &quot;&quot;&quot;</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.command" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">command</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">command</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The executable to run to start the server. For example, <code>python</code> or <code>node</code>.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.args" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">args</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">args</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" href="../../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">]]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Command line args to pass to the <code>command</code> executable. For example, <code>['foo.py']</code> or
<code>['server.js', '--port', '8080']</code>.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.env" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">env</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">env</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="str">str</span></span><span class="p">]]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The environment variables to set for the server. .</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.cwd" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">cwd</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">cwd</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><span title="pathlib.Path">Path</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The working directory to use when spawning the process.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.encoding" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">encoding</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">encoding</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The text encoding used when sending/receiving messages to the server. Defaults to <code>utf-8</code>.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdioParams.encoding_error_handler" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">encoding_error_handler</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">encoding_error_handler</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="n"><span title="typing.Literal">Literal</span></span><span class="p">[</span><span class="s2">&quot;strict&quot;</span><span class="p">,</span> <span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="s2">&quot;replace&quot;</span><span class="p">]</span>
</span><span id="__span-0-3"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The text encoding error handler. Defaults to <code>strict</code>.</p>
<p>See https://docs.python.org/3/library/codecs.html#codec-base-classes for
explanations of possible values.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.mcp.server.MCPServerStdio" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MCPServerStdio</span>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="cai.sdk.agents.mcp.server._MCPServerWithClientSession">_MCPServerWithClientSession</span></code></p>
<p>MCP server implementation that uses the stdio transport. See the [spec]
(https://spec.modelcontextprotocol.io/specification/2024-11-05/basic/transports/#stdio) for
details.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">236</span>
<span class="normal">237</span>
<span class="normal">238</span>
<span class="normal">239</span>
<span class="normal">240</span>
<span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span>
<span class="normal">310</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-236"><span class="k">class</span><span class="w"> </span><span class="nc">MCPServerStdio</span><span class="p">(</span><span class="n">_MCPServerWithClientSession</span><span class="p">):</span>
</span><span id="__span-0-237"><span class="w"> </span><span class="sd">&quot;&quot;&quot;MCP server implementation that uses the stdio transport. See the [spec]</span>
</span><span id="__span-0-238"><span class="sd"> (https://spec.modelcontextprotocol.io/specification/2024-11-05/basic/transports/#stdio) for</span>
</span><span id="__span-0-239"><span class="sd"> details.</span>
</span><span id="__span-0-240"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-241">
</span><span id="__span-0-242"> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-243"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-244"> <span class="n">params</span><span class="p">:</span> <span class="n">MCPServerStdioParams</span><span class="p">,</span>
</span><span id="__span-0-245"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-246"> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-247"> <span class="p">):</span>
</span><span id="__span-0-248"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a new MCP server based on the stdio transport.</span>
</span><span id="__span-0-249">
</span><span id="__span-0-250"><span class="sd"> Args:</span>
</span><span id="__span-0-251"><span class="sd"> params: The params that configure the server. This includes the command to run to</span>
</span><span id="__span-0-252"><span class="sd"> start the server, the args to pass to the command, the environment variables to</span>
</span><span id="__span-0-253"><span class="sd"> set for the server, the working directory to use when spawning the process, and</span>
</span><span id="__span-0-254"><span class="sd"> the text encoding used when sending/receiving messages to the server.</span>
</span><span id="__span-0-255"><span class="sd"> cache_tools_list: Whether to cache the tools list. If `True`, the tools list will be</span>
</span><span id="__span-0-256"><span class="sd"> cached and only fetched from the server once. If `False`, the tools list will be</span>
</span><span id="__span-0-257"><span class="sd"> fetched from the server on each call to `list_tools()`. The cache can be</span>
</span><span id="__span-0-258"><span class="sd"> invalidated by calling `invalidate_tools_cache()`. You should set this to `True`</span>
</span><span id="__span-0-259"><span class="sd"> if you know the server will not change its tools list, because it can drastically</span>
</span><span id="__span-0-260"><span class="sd"> improve latency (by avoiding a round-trip to the server every time).</span>
</span><span id="__span-0-261"><span class="sd"> name: A readable name for the server. If not provided, we&#39;ll create one from the</span>
</span><span id="__span-0-262"><span class="sd"> command.</span>
</span><span id="__span-0-263"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-264"> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">cache_tools_list</span><span class="p">)</span>
</span><span id="__span-0-265">
</span><span id="__span-0-266"> <span class="c1"># Build environment more robustly (avoid stdio buffering for Python)</span>
</span><span id="__span-0-267"> <span class="n">_env</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;env&quot;</span><span class="p">,</span> <span class="p">{})</span> <span class="ow">or</span> <span class="p">{})</span>
</span><span id="__span-0-268"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-269"> <span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_os</span>
</span><span id="__span-0-270"> <span class="n">cmd_lower</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;command&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="__span-0-271"> <span class="k">if</span> <span class="s2">&quot;python&quot;</span> <span class="ow">in</span> <span class="n">cmd_lower</span> <span class="ow">and</span> <span class="s2">&quot;PYTHONUNBUFFERED&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span><span class="p">:</span>
</span><span id="__span-0-272"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;PYTHONUNBUFFERED&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;1&quot;</span>
</span><span id="__span-0-273"> <span class="c1"># Inherit locale if not provided to avoid encoding issues</span>
</span><span id="__span-0-274"> <span class="k">if</span> <span class="s2">&quot;LC_ALL&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span> <span class="ow">and</span> <span class="s2">&quot;LC_ALL&quot;</span> <span class="ow">in</span> <span class="n">_os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
</span><span id="__span-0-275"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;LC_ALL&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;LC_ALL&quot;</span><span class="p">]</span>
</span><span id="__span-0-276"> <span class="c1"># Auto-provide MCP auth token to helper binaries like mcp-proxy</span>
</span><span id="__span-0-277"> <span class="k">if</span> <span class="s2">&quot;API_ACCESS_TOKEN&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span><span class="p">:</span>
</span><span id="__span-0-278"> <span class="n">raw_token</span> <span class="o">=</span> <span class="n">MCPUtil</span><span class="o">.</span><span class="n">_get_default_auth_token_raw</span><span class="p">()</span>
</span><span id="__span-0-279"> <span class="k">if</span> <span class="n">raw_token</span><span class="p">:</span>
</span><span id="__span-0-280"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;API_ACCESS_TOKEN&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">raw_token</span>
</span><span id="__span-0-281"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-282"> <span class="k">pass</span>
</span><span id="__span-0-283">
</span><span id="__span-0-284"> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">StdioServerParameters</span><span class="p">(</span>
</span><span id="__span-0-285"> <span class="n">command</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;command&quot;</span><span class="p">],</span>
</span><span id="__span-0-286"> <span class="n">args</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;args&quot;</span><span class="p">,</span> <span class="p">[]),</span>
</span><span id="__span-0-287"> <span class="n">env</span><span class="o">=</span><span class="n">_env</span> <span class="k">if</span> <span class="n">_env</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-288"> <span class="n">cwd</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;cwd&quot;</span><span class="p">),</span>
</span><span id="__span-0-289"> <span class="n">encoding</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;encoding&quot;</span><span class="p">,</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">),</span>
</span><span id="__span-0-290"> <span class="c1"># Be tolerant by default to avoid fatal decode errors</span>
</span><span id="__span-0-291"> <span class="n">encoding_error_handler</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;encoding_error_handler&quot;</span><span class="p">,</span> <span class="s2">&quot;replace&quot;</span><span class="p">),</span>
</span><span id="__span-0-292"> <span class="p">)</span>
</span><span id="__span-0-293">
</span><span id="__span-0-294"> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">&quot;stdio: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">command</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-295">
</span><span id="__span-0-296"> <span class="k">def</span><span class="w"> </span><span class="nf">create_streams</span><span class="p">(</span>
</span><span id="__span-0-297"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-298"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AbstractAsyncContextManager</span><span class="p">[</span>
</span><span id="__span-0-299"> <span class="nb">tuple</span><span class="p">[</span>
</span><span id="__span-0-300"> <span class="n">MemoryObjectReceiveStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span> <span class="o">|</span> <span class="ne">Exception</span><span class="p">],</span>
</span><span id="__span-0-301"> <span class="n">MemoryObjectSendStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span><span class="p">],</span>
</span><span id="__span-0-302"> <span class="p">]</span>
</span><span id="__span-0-303"> <span class="p">]:</span>
</span><span id="__span-0-304"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create the streams for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-305"> <span class="k">return</span> <span class="n">stdio_client</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</span><span id="__span-0-306">
</span><span id="__span-0-307"> <span class="nd">@property</span>
</span><span id="__span-0-308"> <span class="k">def</span><span class="w"> </span><span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="__span-0-309"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A readable name for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-310"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">name</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A readable name for the server.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.__init__" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">__init__</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="nf">params</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="MCPServerStdioParams (cai.sdk.agents.mcp.server.MCPServerStdioParams)" href="#cai.sdk.agents.mcp.server.MCPServerStdioParams">MCPServerStdioParams</a></span><span class="p">,</span>
</span><span id="__span-0-3"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Create a new MCP server based on the stdio transport.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>params</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="MCPServerStdioParams (cai.sdk.agents.mcp.server.MCPServerStdioParams)" href="#cai.sdk.agents.mcp.server.MCPServerStdioParams">MCPServerStdioParams</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The params that configure the server. This includes the command to run to
start the server, the args to pass to the command, the environment variables to
set for the server, the working directory to use when spawning the process, and
the text encoding used when sending/receiving messages to the server.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>cache_tools_list</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to cache the tools list. If <code>True</code>, the tools list will be
cached and only fetched from the server once. If <code>False</code>, the tools list will be
fetched from the server on each call to <code>list_tools()</code>. The cache can be
invalidated by calling <code>invalidate_tools_cache()</code>. You should set this to <code>True</code>
if you know the server will not change its tools list, because it can drastically
improve latency (by avoiding a round-trip to the server every time).</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>name</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>A readable name for the server. If not provided, we'll create one from the
command.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-242"><span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-243"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-244"> <span class="n">params</span><span class="p">:</span> <span class="n">MCPServerStdioParams</span><span class="p">,</span>
</span><span id="__span-0-245"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-246"> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-247"><span class="p">):</span>
</span><span id="__span-0-248"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a new MCP server based on the stdio transport.</span>
</span><span id="__span-0-249">
</span><span id="__span-0-250"><span class="sd"> Args:</span>
</span><span id="__span-0-251"><span class="sd"> params: The params that configure the server. This includes the command to run to</span>
</span><span id="__span-0-252"><span class="sd"> start the server, the args to pass to the command, the environment variables to</span>
</span><span id="__span-0-253"><span class="sd"> set for the server, the working directory to use when spawning the process, and</span>
</span><span id="__span-0-254"><span class="sd"> the text encoding used when sending/receiving messages to the server.</span>
</span><span id="__span-0-255"><span class="sd"> cache_tools_list: Whether to cache the tools list. If `True`, the tools list will be</span>
</span><span id="__span-0-256"><span class="sd"> cached and only fetched from the server once. If `False`, the tools list will be</span>
</span><span id="__span-0-257"><span class="sd"> fetched from the server on each call to `list_tools()`. The cache can be</span>
</span><span id="__span-0-258"><span class="sd"> invalidated by calling `invalidate_tools_cache()`. You should set this to `True`</span>
</span><span id="__span-0-259"><span class="sd"> if you know the server will not change its tools list, because it can drastically</span>
</span><span id="__span-0-260"><span class="sd"> improve latency (by avoiding a round-trip to the server every time).</span>
</span><span id="__span-0-261"><span class="sd"> name: A readable name for the server. If not provided, we&#39;ll create one from the</span>
</span><span id="__span-0-262"><span class="sd"> command.</span>
</span><span id="__span-0-263"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-264"> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">cache_tools_list</span><span class="p">)</span>
</span><span id="__span-0-265">
</span><span id="__span-0-266"> <span class="c1"># Build environment more robustly (avoid stdio buffering for Python)</span>
</span><span id="__span-0-267"> <span class="n">_env</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;env&quot;</span><span class="p">,</span> <span class="p">{})</span> <span class="ow">or</span> <span class="p">{})</span>
</span><span id="__span-0-268"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-269"> <span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_os</span>
</span><span id="__span-0-270"> <span class="n">cmd_lower</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;command&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="__span-0-271"> <span class="k">if</span> <span class="s2">&quot;python&quot;</span> <span class="ow">in</span> <span class="n">cmd_lower</span> <span class="ow">and</span> <span class="s2">&quot;PYTHONUNBUFFERED&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span><span class="p">:</span>
</span><span id="__span-0-272"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;PYTHONUNBUFFERED&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;1&quot;</span>
</span><span id="__span-0-273"> <span class="c1"># Inherit locale if not provided to avoid encoding issues</span>
</span><span id="__span-0-274"> <span class="k">if</span> <span class="s2">&quot;LC_ALL&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span> <span class="ow">and</span> <span class="s2">&quot;LC_ALL&quot;</span> <span class="ow">in</span> <span class="n">_os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
</span><span id="__span-0-275"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;LC_ALL&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;LC_ALL&quot;</span><span class="p">]</span>
</span><span id="__span-0-276"> <span class="c1"># Auto-provide MCP auth token to helper binaries like mcp-proxy</span>
</span><span id="__span-0-277"> <span class="k">if</span> <span class="s2">&quot;API_ACCESS_TOKEN&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_env</span><span class="p">:</span>
</span><span id="__span-0-278"> <span class="n">raw_token</span> <span class="o">=</span> <span class="n">MCPUtil</span><span class="o">.</span><span class="n">_get_default_auth_token_raw</span><span class="p">()</span>
</span><span id="__span-0-279"> <span class="k">if</span> <span class="n">raw_token</span><span class="p">:</span>
</span><span id="__span-0-280"> <span class="n">_env</span><span class="p">[</span><span class="s2">&quot;API_ACCESS_TOKEN&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">raw_token</span>
</span><span id="__span-0-281"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-282"> <span class="k">pass</span>
</span><span id="__span-0-283">
</span><span id="__span-0-284"> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">StdioServerParameters</span><span class="p">(</span>
</span><span id="__span-0-285"> <span class="n">command</span><span class="o">=</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;command&quot;</span><span class="p">],</span>
</span><span id="__span-0-286"> <span class="n">args</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;args&quot;</span><span class="p">,</span> <span class="p">[]),</span>
</span><span id="__span-0-287"> <span class="n">env</span><span class="o">=</span><span class="n">_env</span> <span class="k">if</span> <span class="n">_env</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-288"> <span class="n">cwd</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;cwd&quot;</span><span class="p">),</span>
</span><span id="__span-0-289"> <span class="n">encoding</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;encoding&quot;</span><span class="p">,</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">),</span>
</span><span id="__span-0-290"> <span class="c1"># Be tolerant by default to avoid fatal decode errors</span>
</span><span id="__span-0-291"> <span class="n">encoding_error_handler</span><span class="o">=</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;encoding_error_handler&quot;</span><span class="p">,</span> <span class="s2">&quot;replace&quot;</span><span class="p">),</span>
</span><span id="__span-0-292"> <span class="p">)</span>
</span><span id="__span-0-293">
</span><span id="__span-0-294"> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">&quot;stdio: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">command</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.create_streams" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">create_streams</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">create_streams</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><span title="contextlib.AbstractAsyncContextManager">AbstractAsyncContextManager</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="n"><span title="tuple">tuple</span></span><span class="p">[</span>
</span><span id="__span-0-3"> <span class="n"><span title="anyio.streams.memory.MemoryObjectReceiveStream">MemoryObjectReceiveStream</span></span><span class="p">[</span>
</span><span id="__span-0-4"> <span class="n"><span title="mcp.types.JSONRPCMessage">JSONRPCMessage</span></span> <span class="o">|</span> <span class="n"><span title="Exception">Exception</span></span>
</span><span id="__span-0-5"> <span class="p">],</span>
</span><span id="__span-0-6"> <span class="n"><span title="anyio.streams.memory.MemoryObjectSendStream">MemoryObjectSendStream</span></span><span class="p">[</span><span class="n"><span title="mcp.types.JSONRPCMessage">JSONRPCMessage</span></span><span class="p">],</span>
</span><span id="__span-0-7"> <span class="p">]</span>
</span><span id="__span-0-8"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Create the streams for the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-296"><span class="k">def</span><span class="w"> </span><span class="nf">create_streams</span><span class="p">(</span>
</span><span id="__span-0-297"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-298"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AbstractAsyncContextManager</span><span class="p">[</span>
</span><span id="__span-0-299"> <span class="nb">tuple</span><span class="p">[</span>
</span><span id="__span-0-300"> <span class="n">MemoryObjectReceiveStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span> <span class="o">|</span> <span class="ne">Exception</span><span class="p">],</span>
</span><span id="__span-0-301"> <span class="n">MemoryObjectSendStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span><span class="p">],</span>
</span><span id="__span-0-302"> <span class="p">]</span>
</span><span id="__span-0-303"><span class="p">]:</span>
</span><span id="__span-0-304"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create the streams for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-305"> <span class="k">return</span> <span class="n">stdio_client</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.connect" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">connect</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">connect</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Connect to the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span>
<span class="normal">130</span>
<span class="normal">131</span>
<span class="normal">132</span>
<span class="normal">133</span>
<span class="normal">134</span>
<span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span>
<span class="normal">146</span>
<span class="normal">147</span>
<span class="normal">148</span>
<span class="normal">149</span>
<span class="normal">150</span>
<span class="normal">151</span>
<span class="normal">152</span>
<span class="normal">153</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-124"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-125"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Connect to the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-126"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-127"> <span class="k">return</span>
</span><span id="__span-0-128">
</span><span id="__span-0-129"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connect_lock</span><span class="p">:</span>
</span><span id="__span-0-130"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-131"> <span class="k">return</span>
</span><span id="__span-0-132">
</span><span id="__span-0-133"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-134"> <span class="n">transport</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">enter_async_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">create_streams</span><span class="p">())</span>
</span><span id="__span-0-135"> <span class="n">read</span><span class="p">,</span> <span class="n">write</span> <span class="o">=</span> <span class="n">transport</span>
</span><span id="__span-0-136"> <span class="n">session</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">enter_async_context</span><span class="p">(</span><span class="n">ClientSession</span><span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">write</span><span class="p">))</span>
</span><span id="__span-0-137"> <span class="k">await</span> <span class="n">session</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
</span><span id="__span-0-138"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
</span><span id="__span-0-139"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-140"> <span class="c1"># Only log connection errors at debug level</span>
</span><span id="__span-0-141"> <span class="n">error_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="__span-0-142"> <span class="n">error_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="__span-0-143"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-144"> <span class="s2">&quot;connection&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-145"> <span class="ow">or</span> <span class="s2">&quot;refused&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-146"> <span class="ow">or</span> <span class="s2">&quot;taskgroup&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-147"> <span class="ow">or</span> <span class="n">error_type</span> <span class="o">==</span> <span class="s2">&quot;ExceptionGroup&quot;</span>
</span><span id="__span-0-148"> <span class="p">):</span>
</span><span id="__span-0-149"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Expected connection error during MCP server init: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-150"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-151"> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error initializing MCP server: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-152"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
</span><span id="__span-0-153"> <span class="k">raise</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.cleanup" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">cleanup</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">cleanup</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Cleanup the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
<span class="normal">193</span>
<span class="normal">194</span>
<span class="normal">195</span>
<span class="normal">196</span>
<span class="normal">197</span>
<span class="normal">198</span>
<span class="normal">199</span>
<span class="normal">200</span>
<span class="normal">201</span>
<span class="normal">202</span>
<span class="normal">203</span>
<span class="normal">204</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-187"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-188"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-189"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanup_lock</span><span class="p">:</span>
</span><span id="__span-0-190"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-191"> <span class="c1"># Suppress async generator warnings during cleanup</span>
</span><span id="__span-0-192"> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
</span><span id="__span-0-193"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span>
</span><span id="__span-0-194"> <span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*asynchronous generator.*&quot;</span>
</span><span id="__span-0-195"> <span class="p">)</span>
</span><span id="__span-0-196"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span>
</span><span id="__span-0-197"> <span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*was never awaited.*&quot;</span>
</span><span id="__span-0-198"> <span class="p">)</span>
</span><span id="__span-0-199"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">aclose</span><span class="p">()</span>
</span><span id="__span-0-200"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-201"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-202"> <span class="c1"># Only log errors that aren&#39;t expected during cleanup</span>
</span><span id="__span-0-203"> <span class="k">if</span> <span class="s2">&quot;ClosedResourceError&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="ow">and</span> <span class="s2">&quot;async generator&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
</span><span id="__span-0-204"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Expected cleanup error (can be ignored): </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.list_tools" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">list_tools</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">list_tools</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" href="../../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><span title="mcp.types.Tool">Tool</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>List the tools available on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">155</span>
<span class="normal">156</span>
<span class="normal">157</span>
<span class="normal">158</span>
<span class="normal">159</span>
<span class="normal">160</span>
<span class="normal">161</span>
<span class="normal">162</span>
<span class="normal">163</span>
<span class="normal">164</span>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span>
<span class="normal">169</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-155"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">list_tools</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">MCPTool</span><span class="p">]:</span>
</span><span id="__span-0-156"><span class="w"> </span><span class="sd">&quot;&quot;&quot;List the tools available on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-157"> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
</span><span id="__span-0-158"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;Server not initialized. Make sure you call `connect()` first.&quot;</span><span class="p">)</span>
</span><span id="__span-0-159">
</span><span id="__span-0-160"> <span class="c1"># Return from cache if caching is enabled, we have tools, and the cache is not dirty</span>
</span><span id="__span-0-161"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_tools_list</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span><span class="p">:</span>
</span><span id="__span-0-162"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span>
</span><span id="__span-0-163">
</span><span id="__span-0-164"> <span class="c1"># Reset the cache dirty to False</span>
</span><span id="__span-0-165"> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-166">
</span><span id="__span-0-167"> <span class="c1"># Fetch the tools from the server</span>
</span><span id="__span-0-168"> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span> <span class="o">=</span> <span class="p">(</span><span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">list_tools</span><span class="p">())</span><span class="o">.</span><span class="n">tools</span>
</span><span id="__span-0-169"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.call_tool" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">call_tool</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">call_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">tool_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="typing.Any">Any</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="__span-0-3"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="mcp.types.CallToolResult">CallToolResult</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Invoke a tool on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">171</span>
<span class="normal">172</span>
<span class="normal">173</span>
<span class="normal">174</span>
<span class="normal">175</span>
<span class="normal">176</span>
<span class="normal">177</span>
<span class="normal">178</span>
<span class="normal">179</span>
<span class="normal">180</span>
<span class="normal">181</span>
<span class="normal">182</span>
<span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-171"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">call_tool</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tool_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">CallToolResult</span><span class="p">:</span>
</span><span id="__span-0-172"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invoke a tool on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-173"> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
</span><span id="__span-0-174"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;Server not initialized. Make sure you call `connect()` first.&quot;</span><span class="p">)</span>
</span><span id="__span-0-175">
</span><span id="__span-0-176"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_lock</span><span class="p">:</span>
</span><span id="__span-0-177"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-178"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span><span id="__span-0-179">
</span><span id="__span-0-180"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-181"> <span class="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">call_tool</span><span class="p">(</span><span class="n">tool_name</span><span class="p">,</span> <span class="n">arguments</span><span class="p">)</span>
</span><span id="__span-0-182"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-183"> <span class="c1"># Ensure resources are released and mark session stale so callers can reconnect</span>
</span><span id="__span-0-184"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
</span><span id="__span-0-185"> <span class="k">raise</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerStdio.invalidate_tools_cache" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">invalidate_tools_cache</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">invalidate_tools_cache</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Invalidate the tools cache.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">120</span>
<span class="normal">121</span>
<span class="normal">122</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-120"><span class="k">def</span><span class="w"> </span><span class="nf">invalidate_tools_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-121"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invalidate the tools cache.&quot;&quot;&quot;</span>
</span><span id="__span-0-122"> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="o">=</span> <span class="kc">True</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.mcp.server.MCPServerSseParams" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MCPServerSseParams</span>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="typing_extensions.TypedDict">TypedDict</span></code></p>
<p>Mirrors the params in<code>mcp.client.sse.sse_client</code>.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span>
<span class="normal">320</span>
<span class="normal">321</span>
<span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
<span class="normal">326</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-313"><span class="k">class</span><span class="w"> </span><span class="nc">MCPServerSseParams</span><span class="p">(</span><span class="n">TypedDict</span><span class="p">):</span>
</span><span id="__span-0-314"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Mirrors the params in`mcp.client.sse.sse_client`.&quot;&quot;&quot;</span>
</span><span id="__span-0-315">
</span><span id="__span-0-316"> <span class="n">url</span><span class="p">:</span> <span class="nb">str</span>
</span><span id="__span-0-317"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The URL of the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-318">
</span><span id="__span-0-319"> <span class="n">headers</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]</span>
</span><span id="__span-0-320"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The headers to send to the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-321">
</span><span id="__span-0-322"> <span class="n">timeout</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span>
</span><span id="__span-0-323"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The timeout for the HTTP request. Defaults to 5 seconds.&quot;&quot;&quot;</span>
</span><span id="__span-0-324">
</span><span id="__span-0-325"> <span class="n">sse_read_timeout</span><span class="p">:</span> <span class="n">NotRequired</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span>
</span><span id="__span-0-326"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The timeout for the SSE connection, in seconds. Defaults to 5 minutes.&quot;&quot;&quot;</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSseParams.url" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">url</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">url</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The URL of the server.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSseParams.headers" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">headers</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">headers</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="str">str</span></span><span class="p">]]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The headers to send to the server.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSseParams.timeout" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">timeout</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">timeout</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="float">float</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The timeout for the HTTP request. Defaults to 5 seconds.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSseParams.sse_read_timeout" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">sse_read_timeout</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">sse_read_timeout</span><span class="p">:</span> <span class="n"><span title="typing_extensions.NotRequired">NotRequired</span></span><span class="p">[</span><span class="n"><span title="float">float</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The timeout for the SSE connection, in seconds. Defaults to 5 minutes.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.mcp.server.MCPServerSse" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MCPServerSse</span>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="cai.sdk.agents.mcp.server._MCPServerWithClientSession">_MCPServerWithClientSession</span></code></p>
<p>MCP server implementation that uses the HTTP with SSE transport. See the [spec]
(https://spec.modelcontextprotocol.io/specification/2024-11-05/basic/transports/#http-with-sse)
for details.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">329</span>
<span class="normal">330</span>
<span class="normal">331</span>
<span class="normal">332</span>
<span class="normal">333</span>
<span class="normal">334</span>
<span class="normal">335</span>
<span class="normal">336</span>
<span class="normal">337</span>
<span class="normal">338</span>
<span class="normal">339</span>
<span class="normal">340</span>
<span class="normal">341</span>
<span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span>
<span class="normal">349</span>
<span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span>
<span class="normal">363</span>
<span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span>
<span class="normal">372</span>
<span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span>
<span class="normal">376</span>
<span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span>
<span class="normal">388</span>
<span class="normal">389</span>
<span class="normal">390</span>
<span class="normal">391</span>
<span class="normal">392</span>
<span class="normal">393</span>
<span class="normal">394</span>
<span class="normal">395</span>
<span class="normal">396</span>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span>
<span class="normal">402</span>
<span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span>
<span class="normal">407</span>
<span class="normal">408</span>
<span class="normal">409</span>
<span class="normal">410</span>
<span class="normal">411</span>
<span class="normal">412</span>
<span class="normal">413</span>
<span class="normal">414</span>
<span class="normal">415</span>
<span class="normal">416</span>
<span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span>
<span class="normal">420</span>
<span class="normal">421</span>
<span class="normal">422</span>
<span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span>
<span class="normal">440</span>
<span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-329"><span class="k">class</span><span class="w"> </span><span class="nc">MCPServerSse</span><span class="p">(</span><span class="n">_MCPServerWithClientSession</span><span class="p">):</span>
</span><span id="__span-0-330"><span class="w"> </span><span class="sd">&quot;&quot;&quot;MCP server implementation that uses the HTTP with SSE transport. See the [spec]</span>
</span><span id="__span-0-331"><span class="sd"> (https://spec.modelcontextprotocol.io/specification/2024-11-05/basic/transports/#http-with-sse)</span>
</span><span id="__span-0-332"><span class="sd"> for details.</span>
</span><span id="__span-0-333"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-334">
</span><span id="__span-0-335"> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-336"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-337"> <span class="n">params</span><span class="p">:</span> <span class="n">MCPServerSseParams</span><span class="p">,</span>
</span><span id="__span-0-338"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-339"> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-340"> <span class="p">):</span>
</span><span id="__span-0-341"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a new MCP server based on the HTTP with SSE transport.</span>
</span><span id="__span-0-342">
</span><span id="__span-0-343"><span class="sd"> Args:</span>
</span><span id="__span-0-344"><span class="sd"> params: The params that configure the server. This includes the URL of the server,</span>
</span><span id="__span-0-345"><span class="sd"> the headers to send to the server, the timeout for the HTTP request, and the</span>
</span><span id="__span-0-346"><span class="sd"> timeout for the SSE connection.</span>
</span><span id="__span-0-347">
</span><span id="__span-0-348"><span class="sd"> cache_tools_list: Whether to cache the tools list. If `True`, the tools list will be</span>
</span><span id="__span-0-349"><span class="sd"> cached and only fetched from the server once. If `False`, the tools list will be</span>
</span><span id="__span-0-350"><span class="sd"> fetched from the server on each call to `list_tools()`. The cache can be</span>
</span><span id="__span-0-351"><span class="sd"> invalidated by calling `invalidate_tools_cache()`. You should set this to `True`</span>
</span><span id="__span-0-352"><span class="sd"> if you know the server will not change its tools list, because it can drastically</span>
</span><span id="__span-0-353"><span class="sd"> improve latency (by avoiding a round-trip to the server every time).</span>
</span><span id="__span-0-354">
</span><span id="__span-0-355"><span class="sd"> name: A readable name for the server. If not provided, we&#39;ll create one from the</span>
</span><span id="__span-0-356"><span class="sd"> URL.</span>
</span><span id="__span-0-357"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-358"> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">cache_tools_list</span><span class="p">)</span>
</span><span id="__span-0-359">
</span><span id="__span-0-360"> <span class="c1"># Ensure sensible defaults and SSE headers</span>
</span><span id="__span-0-361"> <span class="n">_headers</span> <span class="o">=</span> <span class="n">MCPUtil</span><span class="o">.</span><span class="n">get_default_auth_headers</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;headers&quot;</span><span class="p">,</span> <span class="p">{}))</span>
</span><span id="__span-0-362"> <span class="c1"># Request-side headers (server must still send correct response headers)</span>
</span><span id="__span-0-363"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Accept&quot;</span><span class="p">,</span> <span class="s2">&quot;text/event-stream&quot;</span><span class="p">)</span>
</span><span id="__span-0-364"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Cache-Control&quot;</span><span class="p">,</span> <span class="s2">&quot;no-cache&quot;</span><span class="p">)</span>
</span><span id="__span-0-365"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Connection&quot;</span><span class="p">,</span> <span class="s2">&quot;keep-alive&quot;</span><span class="p">)</span>
</span><span id="__span-0-366">
</span><span id="__span-0-367"> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="__span-0-368"> <span class="o">**</span><span class="n">params</span><span class="p">,</span>
</span><span id="__span-0-369"> <span class="s2">&quot;headers&quot;</span><span class="p">:</span> <span class="n">_headers</span><span class="p">,</span>
</span><span id="__span-0-370"> <span class="p">}</span>
</span><span id="__span-0-371"> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">&quot;sse: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-372">
</span><span id="__span-0-373"> <span class="k">def</span><span class="w"> </span><span class="nf">create_streams</span><span class="p">(</span>
</span><span id="__span-0-374"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-375"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AbstractAsyncContextManager</span><span class="p">[</span>
</span><span id="__span-0-376"> <span class="nb">tuple</span><span class="p">[</span>
</span><span id="__span-0-377"> <span class="n">MemoryObjectReceiveStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span> <span class="o">|</span> <span class="ne">Exception</span><span class="p">],</span>
</span><span id="__span-0-378"> <span class="n">MemoryObjectSendStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span><span class="p">],</span>
</span><span id="__span-0-379"> <span class="p">]</span>
</span><span id="__span-0-380"> <span class="p">]:</span>
</span><span id="__span-0-381"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create the streams for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-382"> <span class="k">return</span> <span class="n">sse_client</span><span class="p">(</span>
</span><span id="__span-0-383"> <span class="n">url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">],</span>
</span><span id="__span-0-384"> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;headers&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
</span><span id="__span-0-385"> <span class="n">timeout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;timeout&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span><span id="__span-0-386"> <span class="n">sse_read_timeout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;sse_read_timeout&quot;</span><span class="p">,</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">5</span><span class="p">),</span>
</span><span id="__span-0-387"> <span class="p">)</span>
</span><span id="__span-0-388">
</span><span id="__span-0-389"> <span class="nd">@property</span>
</span><span id="__span-0-390"> <span class="k">def</span><span class="w"> </span><span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="__span-0-391"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A readable name for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-392"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span>
</span><span id="__span-0-393">
</span><span id="__span-0-394"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-395"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the SSE server with special handling for async generators.&quot;&quot;&quot;</span>
</span><span id="__span-0-396"> <span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
</span><span id="__span-0-397"> <span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
</span><span id="__span-0-398">
</span><span id="__span-0-399"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanup_lock</span><span class="p">:</span>
</span><span id="__span-0-400"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-401"> <span class="c1"># For SSE servers, we need to handle cleanup more carefully</span>
</span><span id="__span-0-402"> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
</span><span id="__span-0-403"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="__span-0-404"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*asynchronous generator.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-405"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*didn&#39;t stop after athrow.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-406"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*cancel scope.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-407">
</span><span id="__span-0-408"> <span class="c1"># Try to close gracefully with a short timeout</span>
</span><span id="__span-0-409"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-410"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait_for</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">aclose</span><span class="p">(),</span> <span class="n">timeout</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
</span><span id="__span-0-411"> <span class="k">except</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">TimeoutError</span><span class="p">:</span>
</span><span id="__span-0-412"> <span class="c1"># Expected for SSE connections</span>
</span><span id="__span-0-413"> <span class="k">pass</span>
</span><span id="__span-0-414"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-415"> <span class="c1"># Ignore other cleanup errors for SSE</span>
</span><span id="__span-0-416"> <span class="k">pass</span>
</span><span id="__span-0-417">
</span><span id="__span-0-418"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-419"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-420"> <span class="c1"># Silently ignore all cleanup errors for SSE</span>
</span><span id="__span-0-421"> <span class="k">pass</span>
</span><span id="__span-0-422">
</span><span id="__span-0-423"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-424"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the SSE server with special handling for async generators.&quot;&quot;&quot;</span>
</span><span id="__span-0-425"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanup_lock</span><span class="p">:</span>
</span><span id="__span-0-426"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-427"> <span class="c1"># For SSE connections, we need to handle cleanup differently</span>
</span><span id="__span-0-428"> <span class="c1"># to avoid async generator warnings</span>
</span><span id="__span-0-429"> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
</span><span id="__span-0-430"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="__span-0-431"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*asynchronous generator.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-432"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*was never awaited.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-433">
</span><span id="__span-0-434"> <span class="c1"># Try a quick cleanup with a short timeout</span>
</span><span id="__span-0-435"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-436"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait_for</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">aclose</span><span class="p">(),</span> <span class="n">timeout</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
</span><span id="__span-0-437"> <span class="k">except</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">TimeoutError</span><span class="p">:</span>
</span><span id="__span-0-438"> <span class="c1"># Expected for SSE connections</span>
</span><span id="__span-0-439"> <span class="k">pass</span>
</span><span id="__span-0-440"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-441"> <span class="c1"># Ignore any other errors during SSE cleanup</span>
</span><span id="__span-0-442"> <span class="k">pass</span>
</span><span id="__span-0-443"> <span class="k">finally</span><span class="p">:</span>
</span><span id="__span-0-444"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-445"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-446"> <span class="c1"># Silently ignore all errors for SSE cleanup</span>
</span><span id="__span-0-447"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">name</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A readable name for the server.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.__init__" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">__init__</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="nf">params</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="MCPServerSseParams (cai.sdk.agents.mcp.server.MCPServerSseParams)" href="#cai.sdk.agents.mcp.server.MCPServerSseParams">MCPServerSseParams</a></span><span class="p">,</span>
</span><span id="__span-0-3"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Create a new MCP server based on the HTTP with SSE transport.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>params</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="MCPServerSseParams (cai.sdk.agents.mcp.server.MCPServerSseParams)" href="#cai.sdk.agents.mcp.server.MCPServerSseParams">MCPServerSseParams</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The params that configure the server. This includes the URL of the server,
the headers to send to the server, the timeout for the HTTP request, and the
timeout for the SSE connection.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>cache_tools_list</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to cache the tools list. If <code>True</code>, the tools list will be
cached and only fetched from the server once. If <code>False</code>, the tools list will be
fetched from the server on each call to <code>list_tools()</code>. The cache can be
invalidated by calling <code>invalidate_tools_cache()</code>. You should set this to <code>True</code>
if you know the server will not change its tools list, because it can drastically
improve latency (by avoiding a round-trip to the server every time).</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>name</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>A readable name for the server. If not provided, we'll create one from the
URL.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">335</span>
<span class="normal">336</span>
<span class="normal">337</span>
<span class="normal">338</span>
<span class="normal">339</span>
<span class="normal">340</span>
<span class="normal">341</span>
<span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span>
<span class="normal">349</span>
<span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span>
<span class="normal">363</span>
<span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-335"><span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-0-336"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-337"> <span class="n">params</span><span class="p">:</span> <span class="n">MCPServerSseParams</span><span class="p">,</span>
</span><span id="__span-0-338"> <span class="n">cache_tools_list</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-339"> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-340"><span class="p">):</span>
</span><span id="__span-0-341"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a new MCP server based on the HTTP with SSE transport.</span>
</span><span id="__span-0-342">
</span><span id="__span-0-343"><span class="sd"> Args:</span>
</span><span id="__span-0-344"><span class="sd"> params: The params that configure the server. This includes the URL of the server,</span>
</span><span id="__span-0-345"><span class="sd"> the headers to send to the server, the timeout for the HTTP request, and the</span>
</span><span id="__span-0-346"><span class="sd"> timeout for the SSE connection.</span>
</span><span id="__span-0-347">
</span><span id="__span-0-348"><span class="sd"> cache_tools_list: Whether to cache the tools list. If `True`, the tools list will be</span>
</span><span id="__span-0-349"><span class="sd"> cached and only fetched from the server once. If `False`, the tools list will be</span>
</span><span id="__span-0-350"><span class="sd"> fetched from the server on each call to `list_tools()`. The cache can be</span>
</span><span id="__span-0-351"><span class="sd"> invalidated by calling `invalidate_tools_cache()`. You should set this to `True`</span>
</span><span id="__span-0-352"><span class="sd"> if you know the server will not change its tools list, because it can drastically</span>
</span><span id="__span-0-353"><span class="sd"> improve latency (by avoiding a round-trip to the server every time).</span>
</span><span id="__span-0-354">
</span><span id="__span-0-355"><span class="sd"> name: A readable name for the server. If not provided, we&#39;ll create one from the</span>
</span><span id="__span-0-356"><span class="sd"> URL.</span>
</span><span id="__span-0-357"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-358"> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">cache_tools_list</span><span class="p">)</span>
</span><span id="__span-0-359">
</span><span id="__span-0-360"> <span class="c1"># Ensure sensible defaults and SSE headers</span>
</span><span id="__span-0-361"> <span class="n">_headers</span> <span class="o">=</span> <span class="n">MCPUtil</span><span class="o">.</span><span class="n">get_default_auth_headers</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;headers&quot;</span><span class="p">,</span> <span class="p">{}))</span>
</span><span id="__span-0-362"> <span class="c1"># Request-side headers (server must still send correct response headers)</span>
</span><span id="__span-0-363"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Accept&quot;</span><span class="p">,</span> <span class="s2">&quot;text/event-stream&quot;</span><span class="p">)</span>
</span><span id="__span-0-364"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Cache-Control&quot;</span><span class="p">,</span> <span class="s2">&quot;no-cache&quot;</span><span class="p">)</span>
</span><span id="__span-0-365"> <span class="n">_headers</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;Connection&quot;</span><span class="p">,</span> <span class="s2">&quot;keep-alive&quot;</span><span class="p">)</span>
</span><span id="__span-0-366">
</span><span id="__span-0-367"> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="__span-0-368"> <span class="o">**</span><span class="n">params</span><span class="p">,</span>
</span><span id="__span-0-369"> <span class="s2">&quot;headers&quot;</span><span class="p">:</span> <span class="n">_headers</span><span class="p">,</span>
</span><span id="__span-0-370"> <span class="p">}</span>
</span><span id="__span-0-371"> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">&quot;sse: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;url&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.create_streams" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">create_streams</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">create_streams</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><span title="contextlib.AbstractAsyncContextManager">AbstractAsyncContextManager</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="n"><span title="tuple">tuple</span></span><span class="p">[</span>
</span><span id="__span-0-3"> <span class="n"><span title="anyio.streams.memory.MemoryObjectReceiveStream">MemoryObjectReceiveStream</span></span><span class="p">[</span>
</span><span id="__span-0-4"> <span class="n"><span title="mcp.types.JSONRPCMessage">JSONRPCMessage</span></span> <span class="o">|</span> <span class="n"><span title="Exception">Exception</span></span>
</span><span id="__span-0-5"> <span class="p">],</span>
</span><span id="__span-0-6"> <span class="n"><span title="anyio.streams.memory.MemoryObjectSendStream">MemoryObjectSendStream</span></span><span class="p">[</span><span class="n"><span title="mcp.types.JSONRPCMessage">JSONRPCMessage</span></span><span class="p">],</span>
</span><span id="__span-0-7"> <span class="p">]</span>
</span><span id="__span-0-8"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Create the streams for the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span>
<span class="normal">376</span>
<span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-373"><span class="k">def</span><span class="w"> </span><span class="nf">create_streams</span><span class="p">(</span>
</span><span id="__span-0-374"> <span class="bp">self</span><span class="p">,</span>
</span><span id="__span-0-375"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AbstractAsyncContextManager</span><span class="p">[</span>
</span><span id="__span-0-376"> <span class="nb">tuple</span><span class="p">[</span>
</span><span id="__span-0-377"> <span class="n">MemoryObjectReceiveStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span> <span class="o">|</span> <span class="ne">Exception</span><span class="p">],</span>
</span><span id="__span-0-378"> <span class="n">MemoryObjectSendStream</span><span class="p">[</span><span class="n">JSONRPCMessage</span><span class="p">],</span>
</span><span id="__span-0-379"> <span class="p">]</span>
</span><span id="__span-0-380"><span class="p">]:</span>
</span><span id="__span-0-381"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create the streams for the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-382"> <span class="k">return</span> <span class="n">sse_client</span><span class="p">(</span>
</span><span id="__span-0-383"> <span class="n">url</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">],</span>
</span><span id="__span-0-384"> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;headers&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
</span><span id="__span-0-385"> <span class="n">timeout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;timeout&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span><span id="__span-0-386"> <span class="n">sse_read_timeout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;sse_read_timeout&quot;</span><span class="p">,</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">5</span><span class="p">),</span>
</span><span id="__span-0-387"> <span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.cleanup" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">cleanup</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">cleanup</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Cleanup the SSE server with special handling for async generators.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span>
<span class="normal">440</span>
<span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-423"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-424"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Cleanup the SSE server with special handling for async generators.&quot;&quot;&quot;</span>
</span><span id="__span-0-425"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanup_lock</span><span class="p">:</span>
</span><span id="__span-0-426"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-427"> <span class="c1"># For SSE connections, we need to handle cleanup differently</span>
</span><span id="__span-0-428"> <span class="c1"># to avoid async generator warnings</span>
</span><span id="__span-0-429"> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
</span><span id="__span-0-430"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="__span-0-431"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*asynchronous generator.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-432"> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;.*was never awaited.*&quot;</span><span class="p">)</span>
</span><span id="__span-0-433">
</span><span id="__span-0-434"> <span class="c1"># Try a quick cleanup with a short timeout</span>
</span><span id="__span-0-435"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-436"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait_for</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">aclose</span><span class="p">(),</span> <span class="n">timeout</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
</span><span id="__span-0-437"> <span class="k">except</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">TimeoutError</span><span class="p">:</span>
</span><span id="__span-0-438"> <span class="c1"># Expected for SSE connections</span>
</span><span id="__span-0-439"> <span class="k">pass</span>
</span><span id="__span-0-440"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-441"> <span class="c1"># Ignore any other errors during SSE cleanup</span>
</span><span id="__span-0-442"> <span class="k">pass</span>
</span><span id="__span-0-443"> <span class="k">finally</span><span class="p">:</span>
</span><span id="__span-0-444"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-445"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-446"> <span class="c1"># Silently ignore all errors for SSE cleanup</span>
</span><span id="__span-0-447"> <span class="k">pass</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.connect" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">connect</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">connect</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Connect to the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span>
<span class="normal">130</span>
<span class="normal">131</span>
<span class="normal">132</span>
<span class="normal">133</span>
<span class="normal">134</span>
<span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span>
<span class="normal">146</span>
<span class="normal">147</span>
<span class="normal">148</span>
<span class="normal">149</span>
<span class="normal">150</span>
<span class="normal">151</span>
<span class="normal">152</span>
<span class="normal">153</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-124"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-125"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Connect to the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-126"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-127"> <span class="k">return</span>
</span><span id="__span-0-128">
</span><span id="__span-0-129"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connect_lock</span><span class="p">:</span>
</span><span id="__span-0-130"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-131"> <span class="k">return</span>
</span><span id="__span-0-132">
</span><span id="__span-0-133"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-134"> <span class="n">transport</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">enter_async_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">create_streams</span><span class="p">())</span>
</span><span id="__span-0-135"> <span class="n">read</span><span class="p">,</span> <span class="n">write</span> <span class="o">=</span> <span class="n">transport</span>
</span><span id="__span-0-136"> <span class="n">session</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_stack</span><span class="o">.</span><span class="n">enter_async_context</span><span class="p">(</span><span class="n">ClientSession</span><span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">write</span><span class="p">))</span>
</span><span id="__span-0-137"> <span class="k">await</span> <span class="n">session</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
</span><span id="__span-0-138"> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
</span><span id="__span-0-139"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-140"> <span class="c1"># Only log connection errors at debug level</span>
</span><span id="__span-0-141"> <span class="n">error_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="__span-0-142"> <span class="n">error_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span>
</span><span id="__span-0-143"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-144"> <span class="s2">&quot;connection&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-145"> <span class="ow">or</span> <span class="s2">&quot;refused&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-146"> <span class="ow">or</span> <span class="s2">&quot;taskgroup&quot;</span> <span class="ow">in</span> <span class="n">error_str</span>
</span><span id="__span-0-147"> <span class="ow">or</span> <span class="n">error_type</span> <span class="o">==</span> <span class="s2">&quot;ExceptionGroup&quot;</span>
</span><span id="__span-0-148"> <span class="p">):</span>
</span><span id="__span-0-149"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Expected connection error during MCP server init: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-150"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-151"> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error initializing MCP server: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-152"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
</span><span id="__span-0-153"> <span class="k">raise</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.list_tools" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">list_tools</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">list_tools</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" href="../../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><span title="mcp.types.Tool">Tool</span></span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>List the tools available on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">155</span>
<span class="normal">156</span>
<span class="normal">157</span>
<span class="normal">158</span>
<span class="normal">159</span>
<span class="normal">160</span>
<span class="normal">161</span>
<span class="normal">162</span>
<span class="normal">163</span>
<span class="normal">164</span>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span>
<span class="normal">169</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-155"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">list_tools</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">MCPTool</span><span class="p">]:</span>
</span><span id="__span-0-156"><span class="w"> </span><span class="sd">&quot;&quot;&quot;List the tools available on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-157"> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
</span><span id="__span-0-158"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;Server not initialized. Make sure you call `connect()` first.&quot;</span><span class="p">)</span>
</span><span id="__span-0-159">
</span><span id="__span-0-160"> <span class="c1"># Return from cache if caching is enabled, we have tools, and the cache is not dirty</span>
</span><span id="__span-0-161"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_tools_list</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span><span class="p">:</span>
</span><span id="__span-0-162"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span>
</span><span id="__span-0-163">
</span><span id="__span-0-164"> <span class="c1"># Reset the cache dirty to False</span>
</span><span id="__span-0-165"> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-166">
</span><span id="__span-0-167"> <span class="c1"># Fetch the tools from the server</span>
</span><span id="__span-0-168"> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span> <span class="o">=</span> <span class="p">(</span><span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">list_tools</span><span class="p">())</span><span class="o">.</span><span class="n">tools</span>
</span><span id="__span-0-169"> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tools_list</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.call_tool" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">call_tool</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">call_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">tool_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="typing.Any">Any</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="__span-0-3"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="mcp.types.CallToolResult">CallToolResult</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Invoke a tool on the server.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">171</span>
<span class="normal">172</span>
<span class="normal">173</span>
<span class="normal">174</span>
<span class="normal">175</span>
<span class="normal">176</span>
<span class="normal">177</span>
<span class="normal">178</span>
<span class="normal">179</span>
<span class="normal">180</span>
<span class="normal">181</span>
<span class="normal">182</span>
<span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-171"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">call_tool</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tool_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">CallToolResult</span><span class="p">:</span>
</span><span id="__span-0-172"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invoke a tool on the server.&quot;&quot;&quot;</span>
</span><span id="__span-0-173"> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
</span><span id="__span-0-174"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;Server not initialized. Make sure you call `connect()` first.&quot;</span><span class="p">)</span>
</span><span id="__span-0-175">
</span><span id="__span-0-176"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_lock</span><span class="p">:</span>
</span><span id="__span-0-177"> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-178"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span><span id="__span-0-179">
</span><span id="__span-0-180"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-181"> <span class="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">call_tool</span><span class="p">(</span><span class="n">tool_name</span><span class="p">,</span> <span class="n">arguments</span><span class="p">)</span>
</span><span id="__span-0-182"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-183"> <span class="c1"># Ensure resources are released and mark session stale so callers can reconnect</span>
</span><span id="__span-0-184"> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
</span><span id="__span-0-185"> <span class="k">raise</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.mcp.server.MCPServerSse.invalidate_tools_cache" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">invalidate_tools_cache</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">invalidate_tools_cache</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Invalidate the tools cache.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/mcp/server.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">120</span>
<span class="normal">121</span>
<span class="normal">122</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-120"><span class="k">def</span><span class="w"> </span><span class="nf">invalidate_tools_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="__span-0-121"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Invalidate the tools cache.&quot;&quot;&quot;</span>
</span><span id="__span-0-122"> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_dirty</span> <span class="o">=</span> <span class="kc">True</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.code.copy", "content.code.select", "navigation.path", "navigation.sections", "navigation.expand", "content.code.annotate"], "search": "../../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.c8b220af.min.js"></script>
</body>
</html>