From 489145e325b3c16c4040f4b3aa088dfced5b1f61 Mon Sep 17 00:00:00 2001 From: Zack Lee Date: Mon, 18 Nov 2024 09:12:39 -0500 Subject: [PATCH] cleanup --- images/modelcontextprotocol.png | Bin 22447 -> 0 bytes your-first-server.mdx | 319 -------------------------------- 2 files changed, 319 deletions(-) delete mode 100644 images/modelcontextprotocol.png delete mode 100644 your-first-server.mdx diff --git a/images/modelcontextprotocol.png b/images/modelcontextprotocol.png deleted file mode 100644 index 8287430208a6ff1f08e4d1b8ccbf4b4a83bf2724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22447 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 Ll7(uIh@Jld#zI+e diff --git a/your-first-server.mdx b/your-first-server.mdx deleted file mode 100644 index c17200d..0000000 --- a/your-first-server.mdx +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: "Your first MCP server" -description: "Get started with MCP by building a weather app in 5 minutes" ---- - -Connect AI to anything. MCP (Model Context Protocol) lets your AI applications seamlessly interact with data sources, tools, and services. - - - **Real-world example:** In this quickstart, we'll build an AI-powered weather app that lets users ask about current conditions in any city. Our app will use MCP to connect to a weather API. - - -![Weather App Demo](weather-app-demo.gif) - -## Installation - - - - ```bash - pip install mcp-sdk # Using pip - uv add mcp-sdk # Using uv (recommended) - ``` - - **Requirements:** - - Python 3.8 or higher - - pip or uv package manager - - - ```bash - npm install @modelcontextprotocol/sdk - ``` - - **Requirements:** - - Node.js 16 or higher - - TypeScript 4.7 or higher - - npm or yarn package manager - - - -## Step 1: Create an MCP Server - -Our server will expose a tool that the AI can use to fetch the current weather for any city. - - - - ```python weather_server.py - from mcp.server import Server - from mcp.server.stdio import stdio_server - import aiohttp - - server = Server("weather-server") - - @server.list_tools() - async def list_tools(): - return [{ - "name": "get_weather", - "description": "Get current weather for a city", - "inputSchema": { - "type": "object", - "properties": { - "city": {"type": "string"} - } - } - }] - - @server.call_tool() - async def call_tool(name: str, args: dict): - if name == "get_weather": - async with aiohttp.ClientSession() as session: - city = args["city"] - url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid=YOUR_API_KEY" - async with session.get(url) as resp: - data = await resp.json() - return data["weather"][0]["description"] - - async def main(): - async with stdio_server() as (read, write): - await server.run(read, write) - - if __name__ == "__main__": - import asyncio - asyncio.run(main()) - ``` - - To make real API requests, sign up for a free API key at [OpenWeatherMap](https://openweathermap.org). - - - - ```typescript weather_server.ts - import { Server } from "@modelcontextprotocol/sdk/server"; - import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio"; - import axios from "axios"; - - const server = new Server({ - name: "weather-server", - version: "1.0.0", - }); - - server.setRequestHandler(ListToolsRequestSchema, async () => { - return { - tools: [{ - name: "get_weather", - description: "Get current weather for a city", - inputSchema: { - type: "object", - properties: { - city: { type: "string" } - } - } - }] - }; - }); - - server.setRequestHandler(CallToolRequestSchema, async (request) => { - if (request.params.name === "get_weather") { - const city = request.params.arguments?.city as string; - const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=YOUR_API_KEY`; - const resp = await axios.get(url); - return { - toolResult: resp.data.weather[0].description - }; - } - throw new Error("Tool not found"); - }); - - async function main() { - const transport = new StdioServerTransport(); - await server.connect(transport); - } - - main().catch(console.error); - ``` - - To make real API requests, sign up for a free API key at [OpenWeatherMap](https://openweathermap.org). - - - -## Step 2: Integrate the Server into Your AI App - - - This example uses a mock AI model. In a real app, you would replace this with your actual AI model code that generates a response based on the user's message and any MCP context. - - - - - ```python app.py - from mcp.client import ClientSession - from mcp.client.stdio import stdio_client - import re - - def extract_city(message): - match = re.search(r"in\s+(\w+)", message) - if match: - return match.group(1) - else: - return None - - async def get_weather(city): - async with stdio_client(command="python weather_server.py") as (read, write): - async with ClientSession(read, write) as session: - await session.initialize() - return await session.call_tool("get_weather", {"city": city}) - - async def handle_message(message): - city = extract_city(message) - if city: - weather = await get_weather(city) - return f"The current weather in {city} is: {weather}" - else: - return generate_response(message) # Your existing AI logic - - async def main(): - while True: - message = input("> ") - response = await handle_message(message) - print(response) - - if __name__ == "__main__": - import asyncio - asyncio.run(main()) - ``` - - - - ```typescript app.ts - import { Client } from "@modelcontextprotocol/sdk/client"; - import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio"; - import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types"; - import readline from "readline"; - - function extractCity(message: string): string | null { - const match = message.match(/in\s+(\w+)/); - if (match) { - return match[1]; - } else { - return null; - } - } - - async function getWeather(city: string): Promise { - const transport = new StdioClientTransport({ - command: "ts-node weather_server.ts", - }); - const client = new Client({ - name: "weather-app", - version: "1.0.0", - }); - await client.connect(transport); - const result = await client.request( - { - method: "tools/call", - params: { - name: "get_weather", - arguments: { city } - } - }, - CallToolResultSchema - ); - return result.toolResult as string; - } - - async function handleMessage(message: string): Promise { - const city = extractCity(message); - if (city) { - const weather = await getWeather(city); - return `The current weather in ${city} is: ${weather}`; - } else { - return generateResponse(message); // Your existing AI logic - } - } - - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); - - rl.prompt(); - rl.on("line", async (line) => { - const response = await handleMessage(line); - console.log(response); - rl.prompt(); - }); - ``` - - - -## Step 3: Run It! - - - - In one terminal, start the server: - ```bash - python weather_server.py - ``` - In another terminal, start the app: - ```bash - python app.py - ``` - - - In one terminal, start the server: - ```bash - ts-node weather_server.ts - ``` - In another terminal, start the app: - ```bash - ts-node app.ts - ``` - - - -Now chat with your AI assistant! Try asking about the weather in various cities. - -``` -> What's the weather like in Tokyo? -The current weather in Tokyo is: few clouds - -> How about London? -The current weather in London is: scattered clouds -``` - -## Why MCP Rocks - -- **Effortless integrations.** No custom code needed to connect AI to any API, database, or service. -- **Async built-in.** MCP client/server communication is fully asynchronous out of the box. -- **Type-safe.** Requests and responses are validated against strict schemas. - -## Next Steps - - - - Understand resources, tools, prompts and more - - - Databases, APIs, embeddings, vectorstores... - - - Expose your AI through an API or website - - - Ensure your app is rock solid - - - -## Getting Help - - - - Get support and see what others are building - - - Look up library classes and functions - - - Quick answers to common questions - - - Report bugs or suggest improvements - - \ No newline at end of file