Implementujemy własny serwer MCP z VS Code Copilot

Nasz cel – czyli co nasz serwer MCP będzie robił?

Nasz serwer MCP ma dostarczać informacje o wskazanym kraju.
Informacje takie jak liczba ludności, waluta, powierzchnia i wiele innych.

Dzięki naszemu serwerowi Copilot Agent będzie miał dostęp do szczegółów o danym kraju i będzie mógł bazować na realnych danych.

Jaki REST API wykorzystamy?

Będziemy bazować na darmowym API: https://restcountries.com/

Udostępnia ono endpointy do pobrania informacji o danym kraju:

https://restcountries.com/v3.1/name/poland

Lub o wszystkich krajach (tu musimy podać interesujące nas pola):

https://restcountries.com/v3.1/all?fields=name,capital,region,population,area,flags,languages,currencies

Wymagane narzędzia i biblioteki

Node.js: środowisko uruchomieniowe dla JavaScript, TypeScript

VS Code: środowisko do rozwijania oprogramowania

Konto na GitHub: serwis do dzielenia się kodem, ale też pozwala na dostęp do darmowego Copiloa do VS Code.

Copilot: klient AI do VS Code

Startujemy z projektem

Szybkie przygotowanie projektu (w pustym katalogu z domyślnymi opcjami):

npm init -y

Polecenie npm init -y przygotuje Ci nowy plik package.json z domyślnymi opcjami, które później możesz wyedytować.

Aby zainstalować wymagane zależności:

npm i @modelcontextprotocol/sdk
npm i zod
npm i typescript
npm i @types/node

Albo wszystkie za jednym razem:

npm i @modelcontextprotocol/sdk zod typescript @types/node

Cały wynikowy kod

Struktura plików i katalogów:

mcp-server-example/
├── main.ts
├── package.json
└── .vscode/
    └── mcp.json

Zawartość pliku package.json:

{
  "name": "mcp-server-countries",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "scripts": {
    "test": "npx -y @modelcontextprotocol/inspector npx -y tsx main.ts"
  },
  "keywords": [],
  "author": "jaktestowac.pl",
  "license": "ISC",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.14.0",
    "zod": "^3.25.67",
    "tsx": "^4.19.2",
    "typescript": "^5.4.5"
  }
}

Zawartość pliku main.ts:

import {
  McpServer
} from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";


const server = new McpServer({
  name: "mcp-server-countries",
  version: "1.0.0",
});


server.registerTool(
  "get-a-country",
  {
    title: "Get a specific country details",
    description:
      "Tool to get a specific country details from the REST API based on country name",
    inputSchema: {
      countryName: z.string().describe("The name of the country to get"),
    },
  },
  async ({ countryName }) => {
    const response = await fetch(
      `https://restcountries.com/v3.1/name/${countryName}`
    );
    const text = await response.text();
    return {
      content: [
        {
          type: "text",
          text,
        },
      ],
    };
  }
);


const transport = new StdioServerTransport();
server.connect(transport);

Zawartość pliku mcp.json:

{
  "servers": {
    "mcp-server-countries": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "tsx", "main.ts"]
    }
  },
  "inputs": []
}

Prompt do testów serwera MCP

Przykładowe prompty do testów:

Use tool to get information about country Poland and its population
Use tool to get information about country Poland and county Sweden and tell me what country has bigger area

Czym są tools (narzędzia)?

Tools to funkcje lub akcje udostępniane przez serwer, które model AI może wywoływać w trakcie konwersacji.

Zgodnie ze specyfikacją, narzędzia to funkcje wykonywane przez model AI (na żądanie model wygeneruje wywołanie takiego narzędzia). W praktyce narzędzia pozwalają modelowi wykonać obliczenia, operacje na danych lub działania w świecie zewnętrznym (np. pobranie informacji z API), których sam model nie może bezpośrednio wykonać.

Można je porównać do wywołań typu POST w tradycyjnym API – narzędzia mogą modyfikować stan lub wykonywać efekty uboczne (np. zapis pliku, wysłanie zapytania sieciowego).

Zewnętrzne linki i zasoby

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *