MCP Server PHP dla PHP Springfield-App

wyzwania

Jak budowaliśmy MCP Server dla PHP-owego projektu Springfield-App

Każdy z nas zna to uczucie: chcesz tylko, żeby AI napisało kawałek kodu,
a kończysz w labiryncie nowych protokołów, SDK-ów i pluginów, które obiecują „więcej integracji niż kiedykolwiek”.

Tak właśnie wyglądała nasza przygoda z MCP Serverem — czyli serwerem Model Context Protocol napisanym w TypeScript,
który miał połączyć OpenAI GPT z projektem PHP (Springfield-App).


🎯 Cel

Zbudować lokalny serwer MCP, który pozwala AI:

  • czytać i zapisywać pliki PHP,
  • generować klasy OOP (Controller, Model, Service),
  • komunikować się z GPT przez OpenAI API.

W praktyce – chcieliśmy, żeby AI mogło rozumieć strukturę naszego projektu i modyfikować go w locie.


🧱 Struktura projektu

sprinfiled-app/
├── app/
├── public/
├── mcp-server/
│   ├── src/
│   │   ├── index.ts
│   │   └── openaiChat.ts
│   ├── tsconfig.json
│   ├── package.json
│   └── .env

⚙️ Kod MCP Servera Najważniejszy plik: src/index.ts

import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
import * as fs from 'fs/promises';
import path from 'path';
import { askGPT } from './openaiChat.js';

const TOOLS = [
  { name: 'read_php_file', description: 'Read PHP file', inputSchema: { type: 'object', properties: { filepath: { type: 'string' } }, required: ['filepath'] } },
  { name: 'write_php_file', description: 'Write PHP file', inputSchema: { type: 'object', properties: { filepath: { type: 'string' }, content: { type: 'string' } }, required: ['filepath','content'] } },
  { name: 'generate_php_class', description: 'Generate PHP OOP class', inputSchema: { type: 'object', properties: { className: { type: 'string' }, type: { type: 'string' } }, required: ['className','type'] } },
  { name: 'ask_gpt', description: 'Ask OpenAI GPT', inputSchema: { type: 'object', properties: { prompt: { type: 'string' } }, required: ['prompt'] } }
];

class PHPProjectServer {
  private server: Server;
  constructor() {
    this.server = new Server({ name: 'php-project-server', version: '1.0.0' }, { capabilities: { tools: {} } });
    this.setupHandlers();
  }

  private setupHandlers() {
    this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
      const { name, arguments: args } = request.params;
      if (name === 'ask_gpt') {
        const result = await askGPT(args.prompt);
        return { content: [{ type: 'text', text: result }] };
      }
      return { content: [{ type: 'text', text: `Tool ${name} executed.` }] };
    });
  }

  async run() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
    console.error('[MCP] Tools registered:', TOOLS.map(t => t.name).join(', '));
  }
}

new PHPProjectServer().run().catch(console.error);

💬 Integracja z GPT (openaiChat.ts)

import OpenAI from 'openai';
import dotenv from 'dotenv';
dotenv.config();

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export async function askGPT(prompt: string): Promise<string> {
  const completion = await client.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: prompt }],
  });
  return completion.choices[0]?.message?.content ?? '';
}

🚀 Uruchamianie

cd mcp-server
npx tsc
node build/index.js

Wynik:

[dotenv@17.2.3] injecting env (1) from .env
[MCP] Tools registered: read_php_file, write_php_file, list_php_files, generate_php_class, ask_gpt

🧠 I co dalej?

Tutaj zaczyna się część filozoficzna. Okazało się, że MCP działa… ale VS Code nie ma jeszcze GUI do jego narzędzi. W efekcie narzędzia były dostępne tylko przez terminal (CLI), co prowadziło do ciekawych wniosków:

„Nie potrzebuję protezy do ręki, żeby pisać ołówkiem.” — Scripterix

Właśnie dlatego powstała idea przejścia na czysty CLI + Codex. AI nadal może tworzyć, ale bez zbędnych warstw.

💡 Finalny wniosek

MCP Server to świetna technologia „na jutro”. Ale dziś, jeśli chcesz tworzyć aplikacje, nie eksperymentować z protokołami, Codex i prosty CLI dadzą Ci 10× szybsze efekty.

Koniec MCP – początek prostoty.

„Nie potrzebuję protezy do ręki, żeby pisać ołówkiem.” Teraz to motto projektu Springfield-App.


📦 gotowe do wklejenia do folderu /docs/