कोडिंग एजेंट के लिए 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 projecttext mcp के लिए Bun चाहिए। Node से शुरू करने पर, अगर आपके PATH में bun मौजूद है तो यह ख़ुद को 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 | स्क्रीन सीमाओं के साथ कंपोनेंट ट्री और हर फ़ोकस करने योग्य id |
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 | ग्रिड का आकार (डिफ़ॉल्ट: text.config.ts फ़ाइल में viewport, वरना 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के तहत खुले ब्राउज़र टैब से अटैच नहीं हो सकता।