कोडिंग एजेंट के लिए MCP

text mcp: कोडिंग एजेंट को Model Context Protocol पर नेविगेट करने, कुंजियां दबाने और फ़्रेम पढ़ने दें।

text mcp आपकी app/ डायरेक्टरी को हेडलेस, इन-प्रोसेस चलाता है और Model Context Protocol पर उपलब्ध कराता है, ताकि कोडिंग एजेंट DevTools के बिना इसका इस्तेमाल कर सकें। एजेंट नेविगेट करता है, कुंजियां दबाता है, फ़्रेम को सादे टेक्स्ट के रूप में पढ़ता है और रूट हैंडलर कॉल करता है।

bunx --bun text mcp              # serve ./app over stdiobunx --bun text mcp apps/console # another project

text mcp के लिए Bun चाहिए। Node से शुरू करने पर, अगर आपके PATH में bun मौजूद है तो यह ख़ुद को Bun से दोबारा चलाता है, वरना TX019 के साथ विफल होता है। MCP क्लाइंट इसे आपके लिए शुरू करते हैं, इसलिए आपको इसे हाथ से चलाने की ज़रूरत कम पड़ती है।

सेटअप

हर क्लाइंट आपकी प्रोजेक्ट डायरेक्टरी से text mcp शुरू करता है। bunx --bun इस्तेमाल करें ताकि रूट फ़ाइलें TypeScript के रूप में चलें।

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

या टीम के लिए इसे कमिट करें:

.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"] }  }}

सबडायरेक्टरी में मौजूद प्रोजेक्ट के लिए पाथ जोड़ें: ["--bun", "text", "mcp", "apps/console"]।

टूल

टूलविवरण
list_routesapp/ में मौजूद पेज और रूट हैंडलर, और मौजूदा लोकेशन
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स्क्रीन सीमाओं के साथ कंपोनेंट ट्री और हर फ़ोकस करने योग्य id
findहर मैच की सीमाएं और उसके नीचे मौजूद कंपोनेंट
wait_forटेक्स्ट के दिखने या गायब होने, या ऐप के निष्क्रिय होने का इंतज़ार करें
logsकैप्चर किया गया console.* आउटपुट और React एरर
fetchroute.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ग्रिड का आकार (डिफ़ॉल्ट: text.config.ts फ़ाइल में viewport, वरना 100×32)
--theme <name>थीम प्रीसेट
--no-configtext.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 के तहत खुले ब्राउज़र टैब से अटैच नहीं हो सकता।
GitHub पर यह पेज एडिट करें