Kodlama ajanları için MCP
text mcp: kodlama ajanlarının Model Context Protocol üzerinden gezinmesini, tuşlara basmasını ve kareleri okumasını sağlayın.
text mcp, app/ dizininizi arayüzsüz olarak süreç içinde çalıştırır ve kodlama ajanlarının DevTools olmadan kullanabilmesi için Model Bağlam Protokolü üzerinden sunar. Ajan gezinir, tuşlara basar, kareleri düz metin olarak okur ve rota işleyicilerini çağırır.
bunx --bun text mcp # serve ./app over stdiobunx --bun text mcp apps/console # another projecttext mcp Bun gerektirir. Node ile başlatıldığında, PATH içinde bun varsa kendini Bun ile yeniden çalıştırır; yoksa TX019 hatası verir. MCP istemcileri onu sizin için başlattığından elle çalıştırmanız nadiren gerekir.
Kurulum
Her istemci text mcp komutunu proje dizininizden başlatır. Rota dosyalarının TypeScript olarak çalışması için bunx --bun kullanın.
OpenCode
{ "$schema": "https://opencode.ai/config.json", "mcp": { "textjs": { "type": "local", "command": ["bunx", "--bun", "text", "mcp"], "enabled": true } }}Claude Code
claude mcp add textjs -- bunx --bun text mcpVeya ekip için commit edin:
{ "mcpServers": { "textjs": { "command": "bunx", "args": ["--bun", "text", "mcp"] } }}Cursor
{ "mcpServers": { "textjs": { "command": "bunx", "args": ["--bun", "text", "mcp"] } }}VS Code
{ "servers": { "textjs": { "type": "stdio", "command": "bunx", "args": ["--bun", "text", "mcp"] } }}Alt dizindeki bir proje için yolu sona ekleyin: ["--bun", "text", "mcp", "apps/console"].
Araçlar
| Araç | Açıklama |
|---|---|
list_routes | app/ içindeki sayfalar ve rota işleyicileri ile mevcut konum |
navigate | Bir yol ekleme veya değiştirme ya da back / forward ile gezinme |
read_frame | Rota, boyut, odak ve imleçle birlikte metin olarak kare. styles: true, her span için renk ve öznitelik ekler |
press | Tuş birleşimleri: "down", "ctrl+k", "shift+tab", "tab tab enter", "down*3" |
type | Her karakter için bir tuşa basarak metin yazma (2.000 karaktere kadar; daha fazlası için paste kullanın). submit: true, ardından Enter tuşuna basar |
paste | ⌘V gibi tek bir yapıştırma olayı |
scroll | Fare tekerleğiyle rows (ve cols) kadar kaydırma. <ScrollBox>, klavye odağı olmadan tekerlekle kaydırılır |
resize | Izgara boyutunu sütun ve satır olarak ayarlama |
inspect_tree | Ekran sınırlarıyla bileşen ağacı ve odaklanabilir tüm kimlikler |
find | Her eşleşmenin sınırları ve altındaki bileşen |
wait_for | Metnin görünmesini veya kaybolmasını ya da uygulamanın boşta kalmasını bekleme |
logs | Yakalanan console.* çıktısı ve React hataları |
fetch | Bir route.ts işleyicisini süreç içinde çağırma. Gövdeler maxBytes sınırına kadar, olay akışları streamMs süresince okunur, ardından iptal edilir |
reload | Dosyaları düzenledikten sonra uygulamayı yeniden içe aktarma |
Girdi araçları yeni kareyi döndürür; bu nedenle ajanın her tuştan sonra ayrı bir read_frame çağrısına ihtiyacı yoktur. Mevcut kareye ve rota listesine text://frame ve text://routes kaynakları olarak da erişilebilir.
Tipik bir etkileşim:
→ navigate { "path": "/deployments" }→ press { "keys": "down down enter" }← route: /deployments/dpl_6m3ty8 (route /deployments/[id]) title: "Deployment dpl_6m3ty8 · Edge Console" size: 100×32 frame: 6 idle focus: _txr_c_ ScrollBox [4,12 92×18] ▼ Edge Console Overview Deployments Logs Settings ← Deployments / dpl_6m3ty8 Ready Production …Kareler ve boşta kalma
Her araç, bir kareyi okumadan önce uygulamanın boşta kalmasını bekler: planlanmış kare olmamalı, devam eden fetch olmamalı ve 50 ms boyunca commit veya kare oluşmamalıdır. Böylece ajan, güncellemenin ortasındaki bir kare yerine girdisinin sonucunu görür.
Saniyede bir güncellenen bir <Spinner> veya grafik, güncellemeler arasında yine boşta sayılır; böylece animasyonlu sayfalar okunabilir kalır. 50 ms aralıktan daha sık render edilen bir uygulama hiçbir zaman boşta kalmaz. Okumalar 1,5 saniye sonra beklemeyi bırakır (settleMs bunu değiştirir), en son kareyi aktarır ve busy olarak işaretler. Metin belirtilmeyen wait_for, kendi quietMs değeriyle boşta kalmayı bekler ve uygulama hiç boşta kalmazsa hata döndürür.
Koordinatlar sıfırdan başlayan hücrelerdir: x sütunu, y satırı belirtir. CJK ve emoji gibi geniş karakterler iki sütun kaplar.
Hatalar ve günlükler
stdout protokolü taşır. Uygulamanızın console.* çıktısı, araya giren process.stdout.write çağrıları ve React hataları bunun yerine logs içine gider; ajanın since ile yalnızca yeni kayıtları isteyebilmesi için numaralandırılır. Son okumadan bu yana hata kaydedilmişse sonraki kare başlığı bunu belirtir.
Başarısızlıklar çökme yerine araç hatası olarak döner. Zaman aşımına uğrayan bir araç, sonraki çağrı çalışmadan önce iptal edilir; böylece yavaş bir çağrı sonraki çağrının karesine yazmaz. Text.js kodu olan hatalar bu kodu korur; örneğin bilinmeyen bir tuş için TX007. Uygulama yüklenemezse her araç nedenini açıklar. Dosyayı düzeltin ve reload çağrısını yapın.
Seçenekler
| Seçenek | Açıklama |
|---|---|
--path <pathname> | İlk rota (varsayılan /) |
--cols / --rows | Izgara boyutu (varsayılan: text.config.ts içindeki viewport, yoksa 100×32) |
--theme <name> | Tema ön ayarı |
--no-config | text.config.ts dosyasını yok sayma |
--verbose | Yakalanan günlükleri stderr üzerine de yazma |
Çalışma şekli
text mcp, uygulamanızı text run ile aynı şekilde çalıştırır: her rota modülü baştan içe aktarılır, App Router bellek içi geçmiş kullanır ve aynı kaynağa yapılan fetch("/api/…") çağrıları işleyicilerinizi süreç içinde çalıştırır. Kareler terminal yerine ekran dışı bir hücre ızgarasına gider. Sunucuda render edilen sayfalar (export const runtime = "server") ve bunların async function bileşenleri, text dev komutundaki gibi süreç içinde render edilir ve tamamlandıklarında kare okunur.
reload uygulamayı kaldırır, Bun’un modül önbelleğinden tüm proje modüllerini temizler (app/ dışındaki dosyalar dahil), app/ dizinini yeniden tarar ve mevcut konumda yeniden bağlar.
Sunucuyu kendi sürecinize gömmek veya başka bir aktarım kullanmak için:
import { createTextMcpServer } from "@textjs/app/mcp";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";const { server, controller } = createTextMcpServer({ root: process.cwd() });await server.connect(new StdioServerTransport());void controller.start();Sınırlar
- Uygulama tarayıcıda değil, Bun’da çalışır.
text runkomutundaki gibiwindowvedocumenttanımsızdır. - Her sunucu tek bir ızgarayla tek bir uygulama çalıştırır. Her MCP istemcisi kendi sunucusunu başlatır.
text mcp, uygulamanın kendi arayüzsüz kopyasını çalıştırır.text devaltında açık olan bir tarayıcı sekmesine bağlanamaz.