WebMCP — implementacja krok po kroku dla serwisu na WordPress

przez Łukasz | cze 5, 2026

20 linijek JS, jeden plik PHP i flaga w Chrome Canary. Tyle wystarczy żeby zarejestrować pierwsze narzędzie WebMCP.

Ten artykuł jest praktyczny — kod który działa, pułapki które napotkałem, i wyjaśnienie każdego kroku. Podstawą jest demo z poprzedniego artykułu serii.

Co potrzebujesz

  • Chrome Canary (pobierz z google.com/chrome/canary)
  • Strona na WordPressie (lub dowolna strona z PHP)
  • 20 minut

Nie potrzebujesz: żadnego frameworka, npm, buildu, osobnego serwera.

Krok 1 — włącz flagę w Chrome Canary

Wejdź na chrome://flags i wyszukaj WebMCP. Włącz flagę Enable WebMCP for testing. Zrestartuj przeglądarkę.

Sprawdź w konsoli DevTools czy API jest dostępne:

javascript
console.log(typeof document.modelContext)
// powinno zwrócić: "object"

Jeśli zwróci undefined — flaga nie jest włączona lub masz za starą wersję Canary.

Krok 2 — endpoint PHP

Stwórz plik który będzie obsługiwał wywołania narzędzia. Na WordPress najprościej wgrać go bezpośrednio do katalogu głównego lub do folderu motywu.

Ważne: nie wgrywaj do wp-content/uploads/ jeśli hosting blokuje wykonywanie PHP w tym folderze. Nie podawaj ścieżki bez wp-content jeśli plik jest zagłębiony — WordPress przechwyci request i zrobi redirect.

Minimalna wersja endpointu:

php
<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

$level = trim($_GET['level'] ?? '');
$allowed = ['uczen', 'biznes', 'oryginal', 'inzynier'];

if (!in_array($level, $allowed, true)) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'Nieprawidłowy poziom']);
    exit;
}

// Twoje treści per poziom
$content = [
    'uczen'    => 'Prosta wersja dla ucznia...',
    'biznes'   => 'Wersja dla właściciela biznesu...',
    'oryginal' => 'Oryginalny artykuł...',
    'inzynier' => 'Wersja dla developera...',
];

echo json_encode([
    'ok'      => true,
    'level'   => $level,
    'content' => $content[$level],
]);

Przetestuj w przeglądarce — wejdź na twojadomena.pl/sciezka/plik.php?level=uczen. Powinieneś dostać JSON.

Krok 3 — rejestracja narzędzia w JS

Wklej ten kod na stronie gdzie chcesz udostępnić narzędzie. Np. w Divi przez Custom Code (tylko na tej podstronie, nie globalnie).

javascript
<script>
(function () {
  'use strict';

  var ENDPOINT = 'https://twojadomena.pl/sciezka/plik.php';

  // Sprawdź dostępność WebMCP
  // document.modelContext — Chrome 150+
  // navigator.modelContext — Chrome 146-149
  var ctx = document.modelContext ?? navigator.modelContext ?? null;

  if (!ctx || typeof ctx.registerTool !== 'function') {
    console.info('[WebMCP] Niedostępne w tej przeglądarce.');
    return;
  }

  ctx.registerTool({

    name: 'simplifyArticle',

    description:
      'Zwraca wersję artykułu dostosowaną do poziomu czytelnika. ' +
      'Poziomy: uczen, biznes, oryginal, inzynier.',

    inputSchema: {
      type: 'object',
      properties: {
        level: {
          type: 'string',
          enum: ['uczen', 'biznes', 'oryginal', 'inzynier'],
          description: 'Poziom czytelnika',
        },
      },
      required: ['level'],
    },

    execute: async function (params) {
      try {
        var res  = await fetch(ENDPOINT + '?level=' + encodeURIComponent(params.level));
        var data = await res.json();
        return data.ok
          ? { success: true,  content: data.content }
          : { success: false, error: data.error };
      } catch (err) {
        return { success: false, error: err.message };
      }
    },

  });

  console.info('[WebMCP] ✓ Narzędzie zarejestrowane.');
})();
</script>

Krok 4 — weryfikacja

Otwórz stronę w Chrome Canary z włączoną flagą. W konsoli DevTools sprawdź:

javascript
// Powinno zwrócić tablicę z Twoim narzędziem
const tools = await document.modelContext.getTools();
console.log(tools);

Jeśli widzisz swoje narzędzie z nazwą, opisem i schematem — rejestracja działa.

Wywołaj ręcznie żeby przetestować endpoint:

javascript
const tools = await document.modelContext.getTools();
const result = await tools[0].call({ level: 'uczen' });
console.log(result);

Pułapki które napotkałem

Zła ścieżka URL — najczęstszy błąd. WordPress przechwytuje wszystkie requesty przez mod_rewrite i przekierowuje nieznane ścieżki na stronę główną. Jeśli Twój plik PHP jest w wp-content/themes/motyw/webmcp/plik.php — podaj dokładnie tę ścieżkę w JS, nie skróconą.

Stare API — przed Chrome 150 był navigator.modelContext, od 150 jest document.modelContext. Skrypt wyżej obsługuje oba przez ?? operator.

CORS — jeśli endpoint i strona są na tej samej domenie, CORS nie jest problemem. Jeśli testujesz lokalnie z endpointem na produkcji — dodaj Access-Control-Allow-Origin: * w nagłówkach PHP.

Cache skryptów — po zmianie JS wymuś odświeżenie przez Ctrl+Shift+R żeby mieć pewność że przeglądarka ładuje nową wersję.

Co dalej

Narzędzie jest zarejestrowane i działa. Możesz je wywołać ręcznie z konsoli lub przez agenta w Chrome który rozumie WebMCP.

Automatyczne discovery — agent sam wykrywa narzędzia na stronie bez podpowiadania — zależy od implementacji po stronie klienta. Na dziś (czerwiec 2026) Claude w Chrome wywołuje narzędzie gdy poprosisz go z nazwy. Pełne automatyczne discovery jest w trakcie implementacji wraz z upowszechnieniem standardu.


Następny artykuł: WebMCP w 2026 — stan standardu, roadmapa i kiedy wdrażać na produkcji

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent gubi wątek w długim zadaniu

Agent gubi wątek w długim zadaniu

Objawy Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać. Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej....

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...