MCP Server PHP dla PHP Springfield-App
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/