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 project

text 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

opencode.jsonjson
{  "$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 mcp

Veya ekip için commit edin:

.mcp.jsonjson
{  "mcpServers": {    "textjs": { "command": "bunx", "args": ["--bun", "text", "mcp"] }  }}

Cursor

.cursor/mcp.jsonjson
{  "mcpServers": {    "textjs": { "command": "bunx", "args": ["--bun", "text", "mcp"] }  }}

VS Code

.vscode/mcp.jsonjson
{  "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_routesapp/ içindeki sayfalar ve rota işleyicileri ile mevcut konum
navigateBir yol ekleme veya değiştirme ya da back / forward ile gezinme
read_frameRota, boyut, odak ve imleçle birlikte metin olarak kare. styles: true, her span için renk ve öznitelik ekler
pressTuş birleşimleri: "down", "ctrl+k", "shift+tab", "tab tab enter", "down*3"
typeHer 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ı
scrollFare tekerleğiyle rows (ve cols) kadar kaydırma. <ScrollBox>, klavye odağı olmadan tekerlekle kaydırılır
resizeIzgara boyutunu sütun ve satır olarak ayarlama
inspect_treeEkran sınırlarıyla bileşen ağacı ve odaklanabilir tüm kimlikler
findHer eşleşmenin sınırları ve altındaki bileşen
wait_forMetnin görünmesini veya kaybolmasını ya da uygulamanın boşta kalmasını bekleme
logsYakalanan console.* çıktısı ve React hataları
fetchBir 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
reloadDosyaları 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çenekAçıklama
--path <pathname>İlk rota (varsayılan /)
--cols / --rowsIzgara boyutu (varsayılan: text.config.ts içindeki viewport, yoksa 100×32)
--theme <name>Tema ön ayarı
--no-configtext.config.ts dosyasını yok sayma
--verboseYakalanan 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 run komutundaki gibi window ve document tanı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 dev altında açık olan bir tarayıcı sekmesine bağlanamaz.
Bu sayfayı GitHub’da düzenle