MCP برای عاملهای کدنویسی
text mcp: به عاملهای کدنویسی امکان ناوبری، فشردن کلیدها و خواندن فریمها از طریق Model Context Protocol را بدهید.
دستور text mcp دایرکتوری app/ شما را بدون رابط گرافیکی و درون همان پردازش اجرا میکند و آن را از طریق پروتکل زمینهٔ مدل ارائه میدهد تا عاملهای کدنویسی بتوانند بدون DevTools از آن استفاده کنند. عامل پیمایش میکند، کلیدها را فشار میدهد، فریمها را بهصورت متن ساده میخواند و کنترلگرهای مسیر را فراخوانی میکند.
bunx --bun text mcp # serve ./app over stdiobunx --bun text mcp apps/console # another projectدستور text mcp به Bun نیاز دارد. اگر با Node شروع شود، وقتی bun در PATH شما باشد، خود را با Bun دوباره اجرا میکند و در غیر این صورت با خطای TX019 متوقف میشود. کلاینتهای MCP آن را برای شما شروع میکنند، بنابراین بهندرت آن را دستی اجرا میکنید.
راهاندازی
هر کلاینت دستور text mcp را از دایرکتوری پروژهٔ شما شروع میکند. از دستور bunx --bun استفاده کنید تا فایلهای مسیر بهصورت TypeScript اجرا شوند.
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 mcpیا آن را برای تیم کامیت کنید:
{ "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"] } }}برای پروژهای در یک زیردایرکتوری، مسیر را به انتها اضافه کنید: ["--bun", "text", "mcp", "apps/console"].
ابزارها
| ابزار | توضیحات |
|---|---|
list_routes | صفحهها و کنترلگرهای مسیر در app/ و مکان فعلی |
navigate | افزودن یا جایگزینی یک مسیر، یا رفتن به back / forward |
read_frame | فریم بهصورت متن، همراه با مسیر، اندازه، تمرکز و مکاننما. گزینهٔ styles: true رنگها و ویژگیهای هر span را اضافه میکند |
press | ترکیب کلیدها: "down"، "ctrl+k"، "shift+tab"، "tab tab enter"، "down*3" |
type | تایپ متن با یک کلید برای هر نویسه (تا 2,000؛ برای بیشتر از paste استفاده کنید). گزینهٔ submit: true پس از آن کلید Enter را فشار میدهد |
paste | یک رویداد جایگذاری، مانند ⌘V |
scroll | پیمایش با چرخ ماوس بهاندازهٔ rows (و cols). کامپوننت <ScrollBox> بدون تمرکز صفحهکلید با چرخ ماوس پیمایش میکند |
resize | تنظیم اندازهٔ شبکه برحسب ستون و ردیف |
inspect_tree | درخت کامپوننتها با محدودههای روی صفحه، بههمراه تمام شناسههای قابل تمرکز |
find | محدودهٔ هر تطابق و کامپوننت زیر آن |
wait_for | انتظار برای ظاهر یا ناپدید شدن متن، یا بیکار شدن برنامه |
logs | خروجی ثبتشدهٔ console.* و خطاهای React |
fetch | فراخوانی کنترلگر route.ts درون همان پردازش. بدنهها تا سقف maxBytes خوانده میشوند؛ جریانهای رویداد بهمدت streamMs خوانده و سپس لغو میشوند |
reload | وارد کردن دوبارهٔ برنامه پس از ویرایش فایلها |
ابزارهای ورودی فریم جدید را برمیگردانند، بنابراین عامل پس از هر کلید به فراخوانی جداگانهٔ read_frame نیاز ندارد. فریم فعلی و فهرست مسیرها بهصورت منابع text://frame و text://routes نیز در دسترس هستند.
یک تبادل معمول:
→ 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 …فریمها و حالت بیکار
هر ابزار پیش از خواندن فریم، منتظر بیکار شدن برنامه میماند: هیچ فریمی زمانبندی نشده باشد، هیچ fetch در حال اجرا نباشد و بهمدت 50 ms هیچ کامیت یا فریمی رخ نداده باشد. بنابراین عامل نتیجهٔ ورودی خود را میبیند، نه فریمی در میانهٔ بهروزرسانی.
کامپوننت <Spinner> یا نموداری که هر ثانیه یک بار بهروز میشود، بین بهروزرسانیها همچنان بیکار محسوب میشود، بنابراین صفحههای دارای پویانمایی خوانا میمانند. برنامهای که با فاصلهٔ کمتر از 50 ms رندر میکند هرگز بیکار نمیشود. عملیات خواندن پس از 1.5 ثانیه از انتظار دست میکشد (گزینهٔ settleMs این زمان را تغییر میدهد)، آخرین فریم را تخلیه میکند و آن را با busy علامت میزند. ابزار wait_for بدون متن، با مقدار quietMs خودش منتظر حالت بیکار میماند و اگر این حالت هرگز رخ ندهد، خطا برمیگرداند.
مختصات برحسب سلول و از صفر شروع میشوند: x ستون است و y ردیف. نویسههای عریض مانند CJK و ایموجی دو ستون اشغال میکنند.
خطاها و گزارشها
stdout پروتکل را منتقل میکند. خروجی console.* برنامهٔ شما، فراخوانیهای پراکندهٔ process.stdout.write و خطاهای React بهجای آن به logs میروند و شمارهگذاری میشوند تا عامل بتواند با since فقط ورودیهای جدید را درخواست کند. اگر از آخرین خواندن خطاهایی ثبت شده باشند، سربرگ فریم بعدی این موضوع را نشان میدهد.
شکستها بهصورت خطای ابزار برمیگردند و هرگز به ازکارافتادن منجر نمیشوند. ابزاری که مهلتش تمام شود پیش از اجرای فراخوانی بعدی لغو میشود، بنابراین یک فراخوانی کند هرگز در فریم فراخوانی بعدی تایپ نمیکند. خطاهای دارای کد Text.js آن را حفظ میکنند، برای مثال TX007 برای کلیدی ناشناخته. اگر برنامه بارگیری نشود، هر ابزار دلیل آن را توضیح میدهد. فایل را اصلاح کنید و ابزار reload را فراخوانی کنید.
گزینهها
| گزینه | توضیحات |
|---|---|
--path <pathname> | مسیر نخست (پیشفرض /) |
--cols / --rows | اندازهٔ شبکه (پیشفرض: viewport در text.config.ts، در غیر این صورت 100×32) |
--theme <name> | پیشتنظیم پوسته |
--no-config | نادیده گرفتن فایل text.config.ts |
--verbose | نوشتن گزارشهای ثبتشده در stderr نیز |
نحوهٔ کار
دستور text mcp برنامهٔ شما را مانند text run اجرا میکند: تمام ماژولهای مسیر از ابتدا وارد میشوند، App Router از تاریخچهٔ حافظهای استفاده میکند و فراخوانیهای هممبدأ fetch("/api/…") کنترلگرهای شما را درون همان فرایند اجرا میکنند. فریمها بهجای ترمینال به یک شبکهٔ سلولی خارج از صفحه میروند. صفحههای رندرشده در سمت سرور (export const runtime = "server") و کامپوننتهای async function آنها مانند text dev درون همان فرایند رندر میشوند و پس از تکمیل آنها، فریم خوانده میشود.
ابزار reload برنامه را از حالت نصب خارج میکند، تمام ماژولهای پروژه را از حافظهٔ نهان ماژولهای Bun پاک میکند (از جمله فایلهای خارج از app/)، دایرکتوری app/ را دوباره پویش میکند و برنامه را در مکان فعلی دوباره نصب میکند.
برای تعبیهٔ سرور در فرایند خودتان، یا استفاده از روش انتقال دیگر:
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();محدودیتها
- برنامه در Bun اجرا میشود، نه در مرورگر. مانند
text run، مقادیرwindowوdocumentتعریفنشده هستند. - هر سرور یک برنامه با یک شبکه اجرا میکند. هر کلاینت MCP سرور خودش را شروع میکند.
- دستور
text mcpنسخهٔ بدون رابط گرافیکی خودش از برنامه را اجرا میکند. نمیتواند به زبانهٔ مرورگری که باtext devباز شده است متصل شود.