Skip to content

Commit 4a2ec81

Browse files
committed
new update
1 parent 20728c2 commit 4a2ec81

2 files changed

Lines changed: 305 additions & 0 deletions

File tree

.DS_Store

0 Bytes
Binary file not shown.
Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
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

Comments
 (0)