1+ {
2+ "nbformat" : 4 ,
3+ "nbformat_minor" : 0 ,
4+ "metadata" : {
5+ "colab" : {
6+ "provenance" : []
7+ },
8+ "kernelspec" : {
9+ "name" : " python3" ,
10+ "display_name" : " Python 3"
11+ },
12+ "language_info" : {
13+ "name" : " python"
14+ }
15+ },
16+ "cells" : [
17+ {
18+ "cell_type" : " code" ,
19+ "source" : [
20+ " import json\n " ,
21+ " import asyncio\n " ,
22+ " from dataclasses import dataclass, asdict\n " ,
23+ " from typing import Dict, List, Any, Optional, Callable\n " ,
24+ " from datetime import datetime\n " ,
25+ " import random\n " ,
26+ " \n " ,
27+ " @dataclass\n " ,
28+ " class Resource:\n " ,
29+ " uri: str\n " ,
30+ " name: str\n " ,
31+ " description: str\n " ,
32+ " mime_type: str\n " ,
33+ " content: Any = None\n " ,
34+ " \n " ,
35+ " @dataclass\n " ,
36+ " class Tool:\n " ,
37+ " name: str\n " ,
38+ " description: str\n " ,
39+ " parameters: Dict[str, Any]\n " ,
40+ " handler: Optional[Callable] = None\n " ,
41+ " \n " ,
42+ " @dataclass\n " ,
43+ " class Message:\n " ,
44+ " role: str\n " ,
45+ " content: str\n " ,
46+ " timestamp: str = None\n " ,
47+ " def __post_init__(self):\n " ,
48+ " if not self.timestamp:\n " ,
49+ " self.timestamp = datetime.now().isoformat()"
50+ ],
51+ "metadata" : {
52+ "id" : " 9e7Z197gbkhs"
53+ },
54+ "execution_count" : null ,
55+ "outputs" : []
56+ },
57+ {
58+ "cell_type" : " code" ,
59+ "source" : [
60+ " class MCPServer:\n " ,
61+ " def __init__(self, name: str):\n " ,
62+ " self.name = name\n " ,
63+ " self.resources: Dict[str, Resource] = {}\n " ,
64+ " self.tools: Dict[str, Tool] = {}\n " ,
65+ " self.capabilities = {\" resources\" : True, \" tools\" : True, \" prompts\" : True, \" logging\" : True}\n " ,
66+ " print(f\" ✓ MCP Server '{name}' initialized with capabilities: {list(self.capabilities.keys())}\" )\n " ,
67+ " def register_resource(self, resource: Resource) -> None:\n " ,
68+ " self.resources[resource.uri] = resource\n " ,
69+ " print(f\" → Resource registered: {resource.name} ({resource.uri})\" )\n " ,
70+ " def register_tool(self, tool: Tool) -> None:\n " ,
71+ " self.tools[tool.name] = tool\n " ,
72+ " print(f\" → Tool registered: {tool.name}\" )\n " ,
73+ " async def get_resource(self, uri: str) -> Optional[Resource]:\n " ,
74+ " await asyncio.sleep(0.1)\n " ,
75+ " return self.resources.get(uri)\n " ,
76+ " async def execute_tool(self, tool_name: str, arguments: Dict[str, Any]) -> Any:\n " ,
77+ " if tool_name not in self.tools:\n " ,
78+ " raise ValueError(f\" Tool '{tool_name}' not found\" )\n " ,
79+ " tool = self.tools[tool_name]\n " ,
80+ " if tool.handler:\n " ,
81+ " return await tool.handler(**arguments)\n " ,
82+ " return {\" status\" : \" executed\" , \" tool\" : tool_name, \" args\" : arguments}\n " ,
83+ " def list_resources(self) -> List[Dict[str, str]]:\n " ,
84+ " return [{\" uri\" : r.uri, \" name\" : r.name, \" description\" : r.description} for r in self.resources.values()]\n " ,
85+ " def list_tools(self) -> List[Dict[str, Any]]:\n " ,
86+ " return [{\" name\" : t.name, \" description\" : t.description, \" parameters\" : t.parameters} for t in self.tools.values()]"
87+ ],
88+ "metadata" : {
89+ "id" : " O-DOPi4jbkVF"
90+ },
91+ "execution_count" : null ,
92+ "outputs" : []
93+ },
94+ {
95+ "cell_type" : " code" ,
96+ "source" : [
97+ " class MCPClient:\n " ,
98+ " def __init__(self, client_id: str):\n " ,
99+ " self.client_id = client_id\n " ,
100+ " self.connected_servers: Dict[str, MCPServer] = {}\n " ,
101+ " self.context: List[Message] = []\n " ,
102+ " print(f\"\\ n✓ MCP Client '{client_id}' initialized\" )\n " ,
103+ " def connect_server(self, server: MCPServer) -> None:\n " ,
104+ " self.connected_servers[server.name] = server\n " ,
105+ " print(f\" → Connected to server: {server.name}\" )\n " ,
106+ " async def query_resources(self, server_name: str) -> List[Dict[str, str]]:\n " ,
107+ " if server_name not in self.connected_servers:\n " ,
108+ " raise ValueError(f\" Not connected to server: {server_name}\" )\n " ,
109+ " return self.connected_servers[server_name].list_resources()\n " ,
110+ " async def fetch_resource(self, server_name: str, uri: str) -> Optional[Resource]:\n " ,
111+ " if server_name not in self.connected_servers:\n " ,
112+ " raise ValueError(f\" Not connected to server: {server_name}\" )\n " ,
113+ " server = self.connected_servers[server_name]\n " ,
114+ " resource = await server.get_resource(uri)\n " ,
115+ " if resource:\n " ,
116+ " self.add_to_context(Message(role=\" system\" , content=f\" Fetched resource: {resource.name}\" ))\n " ,
117+ " return resource\n " ,
118+ " async def call_tool(self, server_name: str, tool_name: str, **kwargs) -> Any:\n " ,
119+ " if server_name not in self.connected_servers:\n " ,
120+ " raise ValueError(f\" Not connected to server: {server_name}\" )\n " ,
121+ " server = self.connected_servers[server_name]\n " ,
122+ " result = await server.execute_tool(tool_name, kwargs)\n " ,
123+ " self.add_to_context(Message(role=\" system\" , content=f\" Tool '{tool_name}' executed\" ))\n " ,
124+ " return result\n " ,
125+ " def add_to_context(self, message: Message) -> None:\n " ,
126+ " self.context.append(message)\n " ,
127+ " def get_context(self) -> List[Dict[str, Any]]:\n " ,
128+ " return [asdict(msg) for msg in self.context]"
129+ ],
130+ "metadata" : {
131+ "id" : " _aMmCipbbkP7"
132+ },
133+ "execution_count" : null ,
134+ "outputs" : []
135+ },
136+ {
137+ "cell_type" : " code" ,
138+ "source" : [
139+ " async def analyze_sentiment(text: str) -> Dict[str, Any]:\n " ,
140+ " await asyncio.sleep(0.2)\n " ,
141+ " sentiments = [\" positive\" , \" negative\" , \" neutral\" ]\n " ,
142+ " return {\" text\" : text, \" sentiment\" : random.choice(sentiments), \" confidence\" : round(random.uniform(0.7, 0.99), 2)}\n " ,
143+ " \n " ,
144+ " async def summarize_text(text: str, max_length: int = 100) -> Dict[str, str]:\n " ,
145+ " await asyncio.sleep(0.15)\n " ,
146+ " summary = text[:max_length] + \" ...\" if len(text) > max_length else text\n " ,
147+ " return {\" original_length\" : len(text), \" summary\" : summary, \" compression_ratio\" : round(len(summary) / len(text), 2)}\n " ,
148+ " \n " ,
149+ " async def search_knowledge(query: str, top_k: int = 3) -> List[Dict[str, Any]]:\n " ,
150+ " await asyncio.sleep(0.25)\n " ,
151+ " mock_results = [{\" title\" : f\" Result {i+1} for '{query}'\" , \" score\" : round(random.uniform(0.5, 1.0), 2)} for i in range(top_k)]\n " ,
152+ " return sorted(mock_results, key=lambda x: x[\" score\" ], reverse=True)\n "
153+ ],
154+ "metadata" : {
155+ "id" : " Ojfde3C2bkNA"
156+ },
157+ "execution_count" : null ,
158+ "outputs" : []
159+ },
160+ {
161+ "cell_type" : " code" ,
162+ "source" : [
163+ " async def run_mcp_demo():\n " ,
164+ " print(\" =\" * 60)\n " ,
165+ " print(\" MODEL CONTEXT PROTOCOL (MCP) - ADVANCED TUTORIAL\" )\n " ,
166+ " print(\" =\" * 60)\n " ,
167+ " print(\"\\ n[1] Setting up MCP Server...\" )\n " ,
168+ " server = MCPServer(\" knowledge-server\" )\n " ,
169+ " print(\"\\ n[2] Registering resources...\" )\n " ,
170+ " server.register_resource(Resource(uri=\" docs://python-guide\" , name=\" Python Programming Guide\" , description=\" Comprehensive Python documentation\" , mime_type=\" text/markdown\" , content=\" # Python Guide\\ nPython is a high-level programming language...\" ))\n " ,
171+ " server.register_resource(Resource(uri=\" data://sales-2024\" , name=\" 2024 Sales Data\" , description=\" Annual sales metrics\" , mime_type=\" application/json\" , content={\" q1\" : 125000, \" q2\" : 142000, \" q3\" : 138000, \" q4\" : 165000}))\n " ,
172+ " print(\"\\ n[3] Registering tools...\" )\n " ,
173+ " server.register_tool(Tool(name=\" analyze_sentiment\" , description=\" Analyze sentiment of text\" , parameters={\" text\" : {\" type\" : \" string\" , \" required\" : True}}, handler=analyze_sentiment))\n " ,
174+ " server.register_tool(Tool(name=\" summarize_text\" , description=\" Summarize long text\" , parameters={\" text\" : {\" type\" : \" string\" , \" required\" : True}, \" max_length\" : {\" type\" : \" integer\" , \" default\" : 100}}, handler=summarize_text))\n " ,
175+ " server.register_tool(Tool(name=\" search_knowledge\" , description=\" Search knowledge base\" , parameters={\" query\" : {\" type\" : \" string\" , \" required\" : True}, \" top_k\" : {\" type\" : \" integer\" , \" default\" : 3}}, handler=search_knowledge))\n " ,
176+ " client = MCPClient(\" demo-client\" )\n " ,
177+ " client.connect_server(server)\n " ,
178+ " print(\"\\ n\" + \" =\" * 60)\n " ,
179+ " print(\" DEMONSTRATION: MCP IN ACTION\" )\n " ,
180+ " print(\" =\" * 60)\n " ,
181+ " print(\"\\ n[Demo 1] Listing available resources...\" )\n " ,
182+ " resources = await client.query_resources(\" knowledge-server\" )\n " ,
183+ " for res in resources:\n " ,
184+ " print(f\" • {res['name']}: {res['description']}\" )\n " ,
185+ " print(\"\\ n[Demo 2] Fetching sales data resource...\" )\n " ,
186+ " sales_resource = await client.fetch_resource(\" knowledge-server\" , \" data://sales-2024\" )\n " ,
187+ " if sales_resource:\n " ,
188+ " print(f\" Data: {json.dumps(sales_resource.content, indent=2)}\" )\n " ,
189+ " print(\"\\ n[Demo 3] Analyzing sentiment...\" )\n " ,
190+ " sentiment_result = await client.call_tool(\" knowledge-server\" , \" analyze_sentiment\" , text=\" MCP is an amazing protocol for AI integration!\" )\n " ,
191+ " print(f\" Result: {json.dumps(sentiment_result, indent=2)}\" )\n " ,
192+ " print(\"\\ n[Demo 4] Summarizing text...\" )\n " ,
193+ " summary_result = await client.call_tool(\" knowledge-server\" , \" summarize_text\" , text=\" The Model Context Protocol enables seamless integration between AI models and external data sources...\" , max_length=50)\n " ,
194+ " print(f\" Summary: {summary_result['summary']}\" )\n " ,
195+ " print(\"\\ n[Demo 5] Searching knowledge base...\" )\n " ,
196+ " search_result = await client.call_tool(\" knowledge-server\" , \" search_knowledge\" , query=\" machine learning\" , top_k=3)\n " ,
197+ " print(\" Top results:\" )\n " ,
198+ " for result in search_result:\n " ,
199+ " print(f\" - {result['title']} (score: {result['score']})\" )\n " ,
200+ " print(\"\\ n[Demo 6] Current context window...\" )\n " ,
201+ " context = client.get_context()\n " ,
202+ " print(f\" Context length: {len(context)} messages\" )\n " ,
203+ " for i, msg in enumerate(context[-3:], 1):\n " ,
204+ " print(f\" {i}. [{msg['role']}] {msg['content']}\" )\n " ,
205+ " print(\"\\ n\" + \" =\" * 60)\n " ,
206+ " print(\" ✓ MCP Tutorial Complete!\" )\n " ,
207+ " print(\" =\" * 60)\n " ,
208+ " print(\"\\ nKey Takeaways:\" )\n " ,
209+ " print(\" • MCP enables modular AI-to-resource connections\" )\n " ,
210+ " print(\" • Resources provide context from external sources\" )\n " ,
211+ " print(\" • Tools enable dynamic operations and actions\" )\n " ,
212+ " print(\" • Async design supports efficient I/O operations\" )\n " ,
213+ " \n " ,
214+ " if __name__ == \" __main__\" :\n " ,
215+ " import sys\n " ,
216+ " if 'ipykernel' in sys.modules or 'google.colab' in sys.modules:\n " ,
217+ " await run_mcp_demo()\n " ,
218+ " else:\n " ,
219+ " asyncio.run(run_mcp_demo())"
220+ ],
221+ "metadata" : {
222+ "colab" : {
223+ "base_uri" : " https://localhost:8080/"
224+ },
225+ "id" : " fVoEV4Pgabnx" ,
226+ "outputId" : " c66bf70e-ed22-4b09-ac75-cc4757cbeb8c"
227+ },
228+ "execution_count" : 3 ,
229+ "outputs" : [
230+ {
231+ "output_type" : " stream" ,
232+ "name" : " stdout" ,
233+ "text" : [
234+ " ============================================================\n " ,
235+ " MODEL CONTEXT PROTOCOL (MCP) - ADVANCED TUTORIAL\n " ,
236+ " ============================================================\n " ,
237+ " \n " ,
238+ " [1] Setting up MCP Server...\n " ,
239+ " ✓ MCP Server 'knowledge-server' initialized with capabilities: ['resources', 'tools', 'prompts', 'logging']\n " ,
240+ " \n " ,
241+ " [2] Registering resources...\n " ,
242+ " → Resource registered: Python Programming Guide (docs://python-guide)\n " ,
243+ " → Resource registered: 2024 Sales Data (data://sales-2024)\n " ,
244+ " \n " ,
245+ " [3] Registering tools...\n " ,
246+ " → Tool registered: analyze_sentiment\n " ,
247+ " → Tool registered: summarize_text\n " ,
248+ " → Tool registered: search_knowledge\n " ,
249+ " \n " ,
250+ " ✓ MCP Client 'demo-client' initialized\n " ,
251+ " → Connected to server: knowledge-server\n " ,
252+ " \n " ,
253+ " ============================================================\n " ,
254+ " DEMONSTRATION: MCP IN ACTION\n " ,
255+ " ============================================================\n " ,
256+ " \n " ,
257+ " [Demo 1] Listing available resources...\n " ,
258+ " • Python Programming Guide: Comprehensive Python documentation\n " ,
259+ " • 2024 Sales Data: Annual sales metrics\n " ,
260+ " \n " ,
261+ " [Demo 2] Fetching sales data resource...\n " ,
262+ " Data: {\n " ,
263+ " \" q1\" : 125000,\n " ,
264+ " \" q2\" : 142000,\n " ,
265+ " \" q3\" : 138000,\n " ,
266+ " \" q4\" : 165000\n " ,
267+ " }\n " ,
268+ " \n " ,
269+ " [Demo 3] Analyzing sentiment...\n " ,
270+ " Result: {\n " ,
271+ " \" text\" : \" MCP is an amazing protocol for AI integration!\" ,\n " ,
272+ " \" sentiment\" : \" neutral\" ,\n " ,
273+ " \" confidence\" : 0.81\n " ,
274+ " }\n " ,
275+ " \n " ,
276+ " [Demo 4] Summarizing text...\n " ,
277+ " Summary: The Model Context Protocol enables seamless integr...\n " ,
278+ " \n " ,
279+ " [Demo 5] Searching knowledge base...\n " ,
280+ " Top results:\n " ,
281+ " - Result 1 for 'machine learning' (score: 0.85)\n " ,
282+ " - Result 3 for 'machine learning' (score: 0.77)\n " ,
283+ " - Result 2 for 'machine learning' (score: 0.59)\n " ,
284+ " \n " ,
285+ " [Demo 6] Current context window...\n " ,
286+ " Context length: 4 messages\n " ,
287+ " 1. [system] Tool 'analyze_sentiment' executed\n " ,
288+ " 2. [system] Tool 'summarize_text' executed\n " ,
289+ " 3. [system] Tool 'search_knowledge' executed\n " ,
290+ " \n " ,
291+ " ============================================================\n " ,
292+ " ✓ MCP Tutorial Complete!\n " ,
293+ " ============================================================\n " ,
294+ " \n " ,
295+ " Key Takeaways:\n " ,
296+ " • MCP enables modular AI-to-resource connections\n " ,
297+ " • Resources provide context from external sources\n " ,
298+ " • Tools enable dynamic operations and actions\n " ,
299+ " • Async design supports efficient I/O operations\n "
300+ ]
301+ }
302+ ]
303+ }
304+ ]
305+ }
0 commit comments