[{"data":1,"prerenderedAt":1552},["ShallowReactive",2],{"post-aki-mcp-sv-remote-file-shell-mcp-server":3,"content-query-0vZPSZ3Gob":878},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"categoryKey":11,"readTime":12,"body":13,"_type":872,"_id":873,"_source":874,"_file":875,"_stem":876,"_extension":877},"\u002Fposts\u002Faki-mcp-sv-remote-file-shell-mcp-server","posts",false,"","aki-mcp-sv: Đưa Filesystem & Shell Cục Bộ Lên Web Qua MCP, Không Khoá Quota Theo Device","Kiến trúc kỹ thuật aki-mcp-sv: MCP server tự host qua Tailscale Funnel, xác thực OAuth 2.1, whitelist deny-by-default, không cạnh tranh mcp-remote.","2026-08-08","aiInfra","9 min",{"type":14,"children":15,"toc":863},"root",[16,25,40,44,51,127,161,164,170,229,271,344,347,353,388,432,445,448,454,513,545,548,554,566,674,677,683,756,759,765,798,857],{"type":17,"tag":18,"props":19,"children":21},"element","h1",{"id":20},"aki-mcp-sv-đưa-filesystem-shell-cục-bộ-lên-web-qua-mcp",[22],{"type":23,"value":24},"text","aki-mcp-sv: Đưa Filesystem & Shell Cục Bộ Lên Web Qua MCP",{"type":17,"tag":26,"props":27,"children":28},"p",{},[29,31,38],{"type":23,"value":30},"Claude Desktop mang đến một capability mạnh: cho phép AI trực tiếp đọc\u002Fghi file và chạy lệnh trên filesystem thật. Nhưng do bản chất là native app, quota sử dụng bị khoá cứng vào một device ID mà người dùng không kiểm soát được. ",{"type":17,"tag":32,"props":33,"children":35},"code",{"className":34},[],[36],{"type":23,"value":37},"aki-mcp-sv",{"type":23,"value":39}," giải quyết giới hạn này bằng cách chạy một MCP server ngay trên máy, tự host ra internet qua Tailscale Funnel (bọc HTTPS, xác thực OAuth 2.1), rồi add ngược vào claude.ai hoặc ChatGPT dưới dạng custom connector. Kết quả là truy cập local shell\u002Ffile ngay trên trình duyệt, tính vào quota bản web, không khoá device, không cần cài desktop client.",{"type":17,"tag":41,"props":42,"children":43},"hr",{},[],{"type":17,"tag":45,"props":46,"children":48},"h2",{"id":47},"luồng-kết-nối-tailscale-funnel-oauth-21",[49],{"type":23,"value":50},"Luồng kết nối: Tailscale Funnel + OAuth 2.1",{"type":17,"tag":52,"props":53,"children":57},"pre",{"className":54,"code":55,"language":56,"meta":7,"style":7},"language-mermaid shiki shiki-themes night-owl","graph LR\n    A[Browser: claude.ai \u002F ChatGPT] -->|HTTPS| B[Tailscale Funnel]\n    B --> C[gatekeeper.js]\n    C -->|OAuth 2.1 + passphrase + PKCE S256| D[mcp-hub]\n    D --> E[filesystem__*]\n    D --> F[search__find_path \u002F search__search_content]\n    D --> G[shell__run_cmd]\n","mermaid",[58],{"type":17,"tag":32,"props":59,"children":60},{"__ignoreMap":7},[61,73,82,91,100,109,118],{"type":17,"tag":62,"props":63,"children":66},"span",{"class":64,"line":65},"line",1,[67],{"type":17,"tag":62,"props":68,"children":70},{"style":69},"--shiki-default:#D6DEEB",[71],{"type":23,"value":72},"graph LR\n",{"type":17,"tag":62,"props":74,"children":76},{"class":64,"line":75},2,[77],{"type":17,"tag":62,"props":78,"children":79},{"style":69},[80],{"type":23,"value":81},"    A[Browser: claude.ai \u002F ChatGPT] -->|HTTPS| B[Tailscale Funnel]\n",{"type":17,"tag":62,"props":83,"children":85},{"class":64,"line":84},3,[86],{"type":17,"tag":62,"props":87,"children":88},{"style":69},[89],{"type":23,"value":90},"    B --> C[gatekeeper.js]\n",{"type":17,"tag":62,"props":92,"children":94},{"class":64,"line":93},4,[95],{"type":17,"tag":62,"props":96,"children":97},{"style":69},[98],{"type":23,"value":99},"    C -->|OAuth 2.1 + passphrase + PKCE S256| D[mcp-hub]\n",{"type":17,"tag":62,"props":101,"children":103},{"class":64,"line":102},5,[104],{"type":17,"tag":62,"props":105,"children":106},{"style":69},[107],{"type":23,"value":108},"    D --> E[filesystem__*]\n",{"type":17,"tag":62,"props":110,"children":112},{"class":64,"line":111},6,[113],{"type":17,"tag":62,"props":114,"children":115},{"style":69},[116],{"type":23,"value":117},"    D --> F[search__find_path \u002F search__search_content]\n",{"type":17,"tag":62,"props":119,"children":121},{"class":64,"line":120},7,[122],{"type":17,"tag":62,"props":123,"children":124},{"style":69},[125],{"type":23,"value":126},"    D --> G[shell__run_cmd]\n",{"type":17,"tag":26,"props":128,"children":129},{},[130,136,138,144,146,152,154,159],{"type":17,"tag":32,"props":131,"children":133},{"className":132},[],[134],{"type":23,"value":135},"gatekeeper.js",{"type":23,"value":137}," là cổng public duy nhất. ",{"type":17,"tag":32,"props":139,"children":141},{"className":140},[],[142],{"type":23,"value":143},"mcp-hub",{"type":23,"value":145}," thật chỉ lắng nghe trên loopback, nên admin API nội bộ (",{"type":17,"tag":32,"props":147,"children":149},{"className":148},[],[150],{"type":23,"value":151},"\u002Fapi\u002F*",{"type":23,"value":153},", không xác thực) không bao giờ lộ ra internet dù ",{"type":17,"tag":32,"props":155,"children":157},{"className":156},[],[158],{"type":23,"value":135},{"type":23,"value":160}," có bị lỗi.",{"type":17,"tag":41,"props":162,"children":163},{},[],{"type":17,"tag":45,"props":165,"children":167},{"id":166},"whitelist-thay-vì-blocklist",[168],{"type":23,"value":169},"Whitelist thay vì blocklist",{"type":17,"tag":171,"props":172,"children":173},"blockquote",{},[174],{"type":17,"tag":26,"props":175,"children":176},{},[177,182,184,189,191,197,199,205,207,213,214,220,221,227],{"type":17,"tag":62,"props":178,"children":179},{},[180],{"type":23,"value":181},"!IMPORTANT",{"type":23,"value":183},"\nKhác với Desktop Commander, MCP terminal server phổ biến nhất cho Claude Desktop (dùng blocklist, chỉ chạy nội bộ qua stdio, và tài liệu chính chủ khuyến cáo không expose ra internet), ",{"type":17,"tag":32,"props":185,"children":187},{"className":186},[],[188],{"type":23,"value":37},{"type":23,"value":190}," chọn whitelist deny-by-default ngay từ đầu vì mục tiêu thiết kế là mở ra internet công khai. Cơ chế này cho 4 tính chất: fail-safe (lệnh lạ tự động bị chặn), bề mặt tấn công tối thiểu, giới hạn tới cấp subcommand (",{"type":17,"tag":32,"props":192,"children":194},{"className":193},[],[195],{"type":23,"value":196},"git",{"type":23,"value":198}," chỉ được phép ",{"type":17,"tag":32,"props":200,"children":202},{"className":201},[],[203],{"type":23,"value":204},"status",{"type":23,"value":206},"\u002F",{"type":17,"tag":32,"props":208,"children":210},{"className":209},[],[211],{"type":23,"value":212},"log",{"type":23,"value":206},{"type":17,"tag":32,"props":215,"children":217},{"className":216},[],[218],{"type":23,"value":219},"diff",{"type":23,"value":206},{"type":17,"tag":32,"props":222,"children":224},{"className":223},[],[225],{"type":23,"value":226},"show",{"type":23,"value":228},"), và mặc định read-only.",{"type":17,"tag":26,"props":230,"children":231},{},[232,238,240,246,248,254,256,262,263,269],{"type":17,"tag":32,"props":233,"children":235},{"className":234},[],[236],{"type":23,"value":237},"shell-mcp.js",{"type":23,"value":239}," thực thi lệnh qua ",{"type":17,"tag":32,"props":241,"children":243},{"className":242},[],[244],{"type":23,"value":245},"execFile",{"type":23,"value":247},", không qua shell thật, nên ký tự nối lệnh như ",{"type":17,"tag":32,"props":249,"children":251},{"className":250},[],[252],{"type":23,"value":253},";",{"type":23,"value":255},", ",{"type":17,"tag":32,"props":257,"children":259},{"className":258},[],[260],{"type":23,"value":261},"&&",{"type":23,"value":255},{"type":17,"tag":32,"props":264,"children":266},{"className":265},[],[267],{"type":23,"value":268},"|",{"type":23,"value":270}," bị chặn ở tầng thực thi thay vì lọc chuỗi, tránh toàn bộ lớp command injection dựa trên string parsing.",{"type":17,"tag":171,"props":272,"children":273},{},[274],{"type":17,"tag":26,"props":275,"children":276},{},[277,282,284,290,292,298,300,306,307,313,314,320,322,327,329,335,336,342],{"type":17,"tag":62,"props":278,"children":279},{},[280],{"type":23,"value":281},"!WARNING",{"type":23,"value":283},"\n\"Mặc định read-only\" không phải lý thuyết suông: bản 1.1.0 vẫn giữ ",{"type":17,"tag":32,"props":285,"children":287},{"className":286},[],[288],{"type":23,"value":289},"find",{"type":23,"value":291}," và ",{"type":17,"tag":32,"props":293,"children":295},{"className":294},[],[296],{"type":23,"value":297},"sort",{"type":23,"value":299}," trong allowlist mặc định, dù flag riêng của hai lệnh phá vỡ read-only (",{"type":17,"tag":32,"props":301,"children":303},{"className":302},[],[304],{"type":23,"value":305},"find -delete",{"type":23,"value":206},{"type":17,"tag":32,"props":308,"children":310},{"className":309},[],[311],{"type":23,"value":312},"-exec",{"type":23,"value":255},{"type":17,"tag":32,"props":315,"children":317},{"className":316},[],[318],{"type":23,"value":319},"sort -o \u003Cpath>",{"type":23,"value":321},") và ",{"type":17,"tag":32,"props":323,"children":325},{"className":324},[],[326],{"type":23,"value":245},{"type":23,"value":328}," không chặn được vì nguy hiểm nằm ở chính argv của binary chứ không phải ở shell. Bản 1.2.0 đóng lỗ hổng này (issue #2) bằng cách bỏ hẳn hai lệnh khỏi mặc định thay vì vá từng flag; ",{"type":17,"tag":32,"props":330,"children":332},{"className":331},[],[333],{"type":23,"value":334},"find_path",{"type":23,"value":206},{"type":17,"tag":32,"props":337,"children":339},{"className":338},[],[340],{"type":23,"value":341},"search_content",{"type":23,"value":343}," của arm search thay đúng nhu cầu tra cứu read-only mà hai lệnh đó từng phục vụ.",{"type":17,"tag":41,"props":345,"children":346},{},[],{"type":17,"tag":45,"props":348,"children":350},{"id":349},"oauth-21-claude-và-gemini-dán-tay-chatgpt-và-grok-tự-đăng-ký",[351],{"type":23,"value":352},"OAuth 2.1: Claude và Gemini dán tay, ChatGPT và Grok tự đăng ký",{"type":17,"tag":26,"props":354,"children":355},{},[356,358,363,365,371,372,378,380,386],{"type":23,"value":357},"claude.ai mặc định thử Dynamic Client Registration (DCR) trước khi kết nối. ",{"type":17,"tag":32,"props":359,"children":361},{"className":360},[],[362],{"type":23,"value":37},{"type":23,"value":364}," không quảng cáo endpoint đó cho Claude; ",{"type":17,"tag":32,"props":366,"children":368},{"className":367},[],[369],{"type":23,"value":370},"client_id",{"type":23,"value":206},{"type":17,"tag":32,"props":373,"children":375},{"className":374},[],[376],{"type":23,"value":377},"client_secret",{"type":23,"value":379}," được sinh một lần khi chạy ",{"type":17,"tag":32,"props":381,"children":383},{"className":382},[],[384],{"type":23,"value":385},"npm start",{"type":23,"value":387},", người dùng dán tay vào ô Advanced settings, đúng cơ chế pre-registered client credentials mà tài liệu Anthropic công nhận là cách hợp lệ để bỏ qua DCR. Gemini dùng chung cơ chế này: nó tái sử dụng đúng client confidential của Claude, không tự đăng ký.",{"type":17,"tag":26,"props":389,"children":390},{},[391,393,399,401,407,409,415,416,422,424,430],{"type":23,"value":392},"ChatGPT và Grok làm ngược lại: cả hai tự đăng ký qua ",{"type":17,"tag":32,"props":394,"children":396},{"className":395},[],[397],{"type":23,"value":398},"POST \u002Fregister",{"type":23,"value":400}," (RFC 7591) như public client (",{"type":17,"tag":32,"props":402,"children":404},{"className":403},[],[405],{"type":23,"value":406},"token_endpoint_auth_method: none",{"type":23,"value":408},"), mỗi bên một redirect URI riêng được allowlist sẵn (",{"type":17,"tag":32,"props":410,"children":412},{"className":411},[],[413],{"type":23,"value":414},"chatgpt.com",{"type":23,"value":255},{"type":17,"tag":32,"props":417,"children":419},{"className":418},[],[420],{"type":23,"value":421},"grok.com\u002Fconnectors-oauth-exchange-code\u002F",{"type":23,"value":423},"). Cả bốn flow đều phải vượt qua màn hình passphrase 10 ký tự (~50 bit entropy, không có nút Approve trần vì ",{"type":17,"tag":32,"props":425,"children":427},{"className":426},[],[428],{"type":23,"value":429},"\u002Fauthorize",{"type":23,"value":431}," là endpoint public) và PKCE S256 trước khi lấy được token.",{"type":17,"tag":171,"props":433,"children":434},{},[435],{"type":17,"tag":26,"props":436,"children":437},{},[438,443],{"type":17,"tag":62,"props":439,"children":440},{},[441],{"type":23,"value":442},"!NOTE",{"type":23,"value":444},"\nGemini xác thực OAuth thành công nhưng qua kiểm thử thực tế 2026-08-09 chưa điều khiển tool MCP ổn định (kết nối khoẻ, gọi tool không đáng tin). Claude, ChatGPT và Grok là ba client đáng tin cậy hiện tại.",{"type":17,"tag":41,"props":446,"children":447},{},[],{"type":17,"tag":45,"props":449,"children":451},{"id":450},"kiro-cli-arm-đọc-ghi-đã-gỡ-ở-130",[452],{"type":23,"value":453},"Kiro CLI: arm đọc (ghi đã gỡ ở 1.3.0)",{"type":17,"tag":26,"props":455,"children":456},{},[457,459,465,467,473,475,481,483,495,497,503,505,511],{"type":23,"value":458},"Bản 1.2.0 thêm ",{"type":17,"tag":32,"props":460,"children":462},{"className":461},[],[463],{"type":23,"value":464},"kiro-mcp.js",{"type":23,"value":466},". ",{"type":17,"tag":32,"props":468,"children":470},{"className":469},[],[471],{"type":23,"value":472},"kiro_read",{"type":23,"value":474}," (",{"type":17,"tag":32,"props":476,"children":478},{"className":477},[],[479],{"type":23,"value":480},"--trust-tools=fs_read",{"type":23,"value":482},") giữ nguyên; ",{"type":17,"tag":484,"props":485,"children":486},"strong",{},[487,493],{"type":17,"tag":32,"props":488,"children":490},{"className":489},[],[491],{"type":23,"value":492},"kiro_write",{"type":23,"value":494}," bị gỡ ở 1.3.0",{"type":23,"value":496}," — ghi file đi qua filesystem MCP của session đang kết nối. Model khoá ",{"type":17,"tag":32,"props":498,"children":500},{"className":499},[],[501],{"type":23,"value":502},"claude-sonnet-4.5",{"type":23,"value":504},". 1.2.1 live-verify với ",{"type":17,"tag":32,"props":506,"children":508},{"className":507},[],[509],{"type":23,"value":510},"kiro-cli",{"type":23,"value":512}," 2.16.2 và sửa merge server thiếu trên install cũ.",{"type":17,"tag":171,"props":514,"children":515},{},[516],{"type":17,"tag":26,"props":517,"children":518},{},[519,521,526,528,534,536,543],{"type":23,"value":520},"Cập nhật ",{"type":17,"tag":484,"props":522,"children":523},{},[524],{"type":23,"value":525},"1.3.0–1.4.0",{"type":23,"value":527}," (trusted dirs, allowlist chips, panel multi-client tabs, ",{"type":17,"tag":32,"props":529,"children":531},{"className":530},[],[532],{"type":23,"value":533},"search_content -iE",{"type":23,"value":535},"): xem ",{"type":17,"tag":537,"props":538,"children":540},"a",{"href":539},"\u002Fposts\u002Faki-mcp-sv-1-4-0-multi-client-panel\u002F",[541],{"type":23,"value":542},"aki-mcp-sv 1.4.0",{"type":23,"value":544},".",{"type":17,"tag":41,"props":546,"children":547},{},[],{"type":17,"tag":45,"props":549,"children":551},{"id":550},"không-phải-mcp-remote-không-phải-saas",[552],{"type":23,"value":553},"Không phải mcp-remote, không phải SaaS",{"type":17,"tag":26,"props":555,"children":556},{},[557,559,564],{"type":23,"value":558},"Nhìn rộng ra, phần lớn MCP server hiện có rơi vào ba nhóm không giải quyết cùng bài toán với ",{"type":17,"tag":32,"props":560,"children":562},{"className":561},[],[563],{"type":23,"value":37},{"type":23,"value":565},":",{"type":17,"tag":567,"props":568,"children":569},"table",{},[570,594],{"type":17,"tag":571,"props":572,"children":573},"thead",{},[574],{"type":17,"tag":575,"props":576,"children":577},"tr",{},[578,584,589],{"type":17,"tag":579,"props":580,"children":581},"th",{},[582],{"type":23,"value":583},"Nhóm",{"type":17,"tag":579,"props":585,"children":586},{},[587],{"type":23,"value":588},"Đại diện",{"type":17,"tag":579,"props":590,"children":591},{},[592],{"type":23,"value":593},"Vấn đề giải quyết",{"type":17,"tag":595,"props":596,"children":597},"tbody",{},[598,617,635,653],{"type":17,"tag":575,"props":599,"children":600},{},[601,607,612],{"type":17,"tag":602,"props":603,"children":604},"td",{},[605],{"type":23,"value":606},"Chỉ chạy nội bộ",{"type":17,"tag":602,"props":608,"children":609},{},[610],{"type":23,"value":611},"Desktop Commander, server-filesystem chính thức của Anthropic",{"type":17,"tag":602,"props":613,"children":614},{},[615],{"type":23,"value":616},"Không thiết kế để expose ra internet",{"type":17,"tag":575,"props":618,"children":619},{},[620,625,630],{"type":17,"tag":602,"props":621,"children":622},{},[623],{"type":23,"value":624},"Bridge\u002Fproxy, không phải server",{"type":17,"tag":602,"props":626,"children":627},{},[628],{"type":23,"value":629},"mcp-remote (geelen)",{"type":17,"tag":602,"props":631,"children":632},{},[633],{"type":23,"value":634},"Relay stdio↔HTTP\u002FSSE tới một MCP server từ xa đã tồn tại sẵn, tự nó không cấp quyền filesystem\u002Fshell nào",{"type":17,"tag":575,"props":636,"children":637},{},[638,643,648],{"type":17,"tag":602,"props":639,"children":640},{},[641],{"type":23,"value":642},"SaaS chạy trên cloud của bên thứ ba",{"type":17,"tag":602,"props":644,"children":645},{},[646],{"type":23,"value":647},"Composio, Smithery-hosted MCP",{"type":17,"tag":602,"props":649,"children":650},{},[651],{"type":23,"value":652},"Middleman gọi API bên thứ ba (GitHub, Slack...), không đụng vào filesystem\u002Fshell máy cá nhân",{"type":17,"tag":575,"props":654,"children":655},{},[656,661,669],{"type":17,"tag":602,"props":657,"children":658},{},[659],{"type":23,"value":660},"Tự host, tự expose",{"type":17,"tag":602,"props":662,"children":663},{},[664],{"type":17,"tag":32,"props":665,"children":667},{"className":666},[],[668],{"type":23,"value":37},{"type":17,"tag":602,"props":670,"children":671},{},[672],{"type":23,"value":673},"Chạy trên máy của bạn, tự expose qua Tailscale Funnel, toàn quyền kiểm soát hạ tầng",{"type":17,"tag":41,"props":675,"children":676},{},[],{"type":17,"tag":45,"props":678,"children":680},{"id":679},"_6-bản-release-trong-3-ngày",[681],{"type":23,"value":682},"6 bản release trong 3 ngày",{"type":17,"tag":684,"props":685,"children":686},"ul",{},[687,698,708,718,728,738],{"type":17,"tag":688,"props":689,"children":690},"li",{},[691,696],{"type":17,"tag":484,"props":692,"children":693},{},[694],{"type":23,"value":695},"v1.0.0",{"type":23,"value":697}," (2026-08-07): bản public đầu tiên, xoá sạch path đặc thù máy tác giả.",{"type":17,"tag":688,"props":699,"children":700},{},[701,706],{"type":17,"tag":484,"props":702,"children":703},{},[704],{"type":23,"value":705},"v1.0.1",{"type":23,"value":707}," (2026-08-07): gộp allowlist của search và shell thành một danh sách duy nhất, tránh lệch pha giữa hai bản sao.",{"type":17,"tag":688,"props":709,"children":710},{},[711,716],{"type":17,"tag":484,"props":712,"children":713},{},[714],{"type":23,"value":715},"v1.0.2",{"type":23,"value":717}," (2026-08-08): rút gọn README, dọn 46 dấu gạch em dash thừa.",{"type":17,"tag":688,"props":719,"children":720},{},[721,726],{"type":17,"tag":484,"props":722,"children":723},{},[724],{"type":23,"value":725},"v1.1.0",{"type":23,"value":727}," (2026-08-08): thêm connector ChatGPT (tự đăng ký qua RFC 7591, đóng góp qua PR của contributor capybara\u002Fokdev888), thống nhất kiến trúc cho Windows\u002FLinux\u002FmacOS, sửa lỗi log phiên kết nối bị tràn.",{"type":17,"tag":688,"props":729,"children":730},{},[731,736],{"type":17,"tag":484,"props":732,"children":733},{},[734],{"type":23,"value":735},"v1.2.0",{"type":23,"value":737}," (2026-08-09): thêm connector Gemini và Grok, thêm arm Kiro CLI, nén instruction prompt dưới 1.500 ký tự, đóng lỗ hổng read-only mặc định của shell allowlist (issue #2).",{"type":17,"tag":688,"props":739,"children":740},{},[741,746,748,754],{"type":17,"tag":484,"props":742,"children":743},{},[744],{"type":23,"value":745},"v1.2.1",{"type":23,"value":747}," (2026-08-09): sửa lỗi ",{"type":17,"tag":32,"props":749,"children":751},{"className":750},[],[752],{"type":23,"value":753},"redirect_uri",{"type":23,"value":755}," khiến Gemini\u002FGrok không kết nối được, Kiro arm thật sự triển khai được cho install cũ, đổi tên connector sang OS-neutral.",{"type":17,"tag":41,"props":757,"children":758},{},[],{"type":17,"tag":45,"props":760,"children":762},{"id":761},"giới-hạn",[763],{"type":23,"value":764},"Giới hạn",{"type":17,"tag":171,"props":766,"children":767},{},[768],{"type":17,"tag":26,"props":769,"children":770},{},[771,775,777,782,784,789,791,796],{"type":17,"tag":62,"props":772,"children":773},{},[774],{"type":23,"value":442},{"type":23,"value":776},"\nKhông xoay vòng refresh token cho Claude, chấp nhận được vì đây là confidential client (có ",{"type":17,"tag":32,"props":778,"children":780},{"className":779},[],[781],{"type":23,"value":377},{"type":23,"value":783},"). Restart ",{"type":17,"tag":32,"props":785,"children":787},{"className":786},[],[788],{"type":23,"value":385},{"type":23,"value":790}," làm mất toàn bộ session đang cấp vì token chỉ sống trong RAM. Không rate-limit ",{"type":17,"tag":32,"props":792,"children":794},{"className":793},[],[795],{"type":23,"value":429},{"type":23,"value":797},", chấp nhận được nhờ entropy ~50 bit của passphrase khiến brute-force không khả thi. Gemini xác thực được nhưng chưa điều khiển tool đáng tin cậy.",{"type":17,"tag":26,"props":799,"children":800},{},[801,806,808,814,815,821,822,828,829,835,836,842,843,849,850,856],{"type":17,"tag":484,"props":802,"children":803},{},[804],{"type":23,"value":805},"Yêu cầu:",{"type":23,"value":807}," Node.js, tài khoản Tailscale đã bật Funnel (miễn phí trên mọi gói). Sau khi kết nối, mỗi client gọi được 20 tool MCP qua 5 nhóm: ",{"type":17,"tag":32,"props":809,"children":811},{"className":810},[],[812],{"type":23,"value":813},"filesystem__*",{"type":23,"value":255},{"type":17,"tag":32,"props":816,"children":818},{"className":817},[],[819],{"type":23,"value":820},"search__find_path",{"type":23,"value":206},{"type":17,"tag":32,"props":823,"children":825},{"className":824},[],[826],{"type":23,"value":827},"search__search_content",{"type":23,"value":255},{"type":17,"tag":32,"props":830,"children":832},{"className":831},[],[833],{"type":23,"value":834},"shell__run_cmd",{"type":23,"value":255},{"type":17,"tag":32,"props":837,"children":839},{"className":838},[],[840],{"type":23,"value":841},"agy__agy_run",{"type":23,"value":255},{"type":17,"tag":32,"props":844,"children":846},{"className":845},[],[847],{"type":23,"value":848},"kiro__kiro_read",{"type":23,"value":206},{"type":17,"tag":32,"props":851,"children":853},{"className":852},[],[854],{"type":23,"value":855},"kiro__kiro_write",{"type":23,"value":544},{"type":17,"tag":858,"props":859,"children":860},"style",{},[861],{"type":23,"value":862},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":75,"depth":75,"links":864},[865,866,867,868,869,870,871],{"id":47,"depth":75,"text":50},{"id":166,"depth":75,"text":169},{"id":349,"depth":75,"text":352},{"id":450,"depth":75,"text":453},{"id":550,"depth":75,"text":553},{"id":679,"depth":75,"text":682},{"id":761,"depth":75,"text":764},"markdown","content:posts:aki-mcp-sv-remote-file-shell-mcp-server.md","content","posts\u002Faki-mcp-sv-remote-file-shell-mcp-server.md","posts\u002Faki-mcp-sv-remote-file-shell-mcp-server","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"categoryKey":11,"readTime":12,"body":879,"_type":872,"_id":873,"_source":874,"_file":875,"_stem":876,"_extension":877},{"type":14,"children":880,"toc":1543},[881,885,895,898,902,957,984,987,991,1038,1071,1130,1133,1137,1165,1199,1210,1213,1217,1261,1284,1287,1291,1301,1389,1392,1396,1453,1456,1460,1489,1539],{"type":17,"tag":18,"props":882,"children":883},{"id":20},[884],{"type":23,"value":24},{"type":17,"tag":26,"props":886,"children":887},{},[888,889,894],{"type":23,"value":30},{"type":17,"tag":32,"props":890,"children":892},{"className":891},[],[893],{"type":23,"value":37},{"type":23,"value":39},{"type":17,"tag":41,"props":896,"children":897},{},[],{"type":17,"tag":45,"props":899,"children":900},{"id":47},[901],{"type":23,"value":50},{"type":17,"tag":52,"props":903,"children":904},{"className":54,"code":55,"language":56,"meta":7,"style":7},[905],{"type":17,"tag":32,"props":906,"children":907},{"__ignoreMap":7},[908,915,922,929,936,943,950],{"type":17,"tag":62,"props":909,"children":910},{"class":64,"line":65},[911],{"type":17,"tag":62,"props":912,"children":913},{"style":69},[914],{"type":23,"value":72},{"type":17,"tag":62,"props":916,"children":917},{"class":64,"line":75},[918],{"type":17,"tag":62,"props":919,"children":920},{"style":69},[921],{"type":23,"value":81},{"type":17,"tag":62,"props":923,"children":924},{"class":64,"line":84},[925],{"type":17,"tag":62,"props":926,"children":927},{"style":69},[928],{"type":23,"value":90},{"type":17,"tag":62,"props":930,"children":931},{"class":64,"line":93},[932],{"type":17,"tag":62,"props":933,"children":934},{"style":69},[935],{"type":23,"value":99},{"type":17,"tag":62,"props":937,"children":938},{"class":64,"line":102},[939],{"type":17,"tag":62,"props":940,"children":941},{"style":69},[942],{"type":23,"value":108},{"type":17,"tag":62,"props":944,"children":945},{"class":64,"line":111},[946],{"type":17,"tag":62,"props":947,"children":948},{"style":69},[949],{"type":23,"value":117},{"type":17,"tag":62,"props":951,"children":952},{"class":64,"line":120},[953],{"type":17,"tag":62,"props":954,"children":955},{"style":69},[956],{"type":23,"value":126},{"type":17,"tag":26,"props":958,"children":959},{},[960,965,966,971,972,977,978,983],{"type":17,"tag":32,"props":961,"children":963},{"className":962},[],[964],{"type":23,"value":135},{"type":23,"value":137},{"type":17,"tag":32,"props":967,"children":969},{"className":968},[],[970],{"type":23,"value":143},{"type":23,"value":145},{"type":17,"tag":32,"props":973,"children":975},{"className":974},[],[976],{"type":23,"value":151},{"type":23,"value":153},{"type":17,"tag":32,"props":979,"children":981},{"className":980},[],[982],{"type":23,"value":135},{"type":23,"value":160},{"type":17,"tag":41,"props":985,"children":986},{},[],{"type":17,"tag":45,"props":988,"children":989},{"id":166},[990],{"type":23,"value":169},{"type":17,"tag":171,"props":992,"children":993},{},[994],{"type":17,"tag":26,"props":995,"children":996},{},[997,1001,1002,1007,1008,1013,1014,1019,1020,1025,1026,1031,1032,1037],{"type":17,"tag":62,"props":998,"children":999},{},[1000],{"type":23,"value":181},{"type":23,"value":183},{"type":17,"tag":32,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":23,"value":37},{"type":23,"value":190},{"type":17,"tag":32,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":23,"value":196},{"type":23,"value":198},{"type":17,"tag":32,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":23,"value":204},{"type":23,"value":206},{"type":17,"tag":32,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":23,"value":212},{"type":23,"value":206},{"type":17,"tag":32,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":23,"value":219},{"type":23,"value":206},{"type":17,"tag":32,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":23,"value":226},{"type":23,"value":228},{"type":17,"tag":26,"props":1039,"children":1040},{},[1041,1046,1047,1052,1053,1058,1059,1064,1065,1070],{"type":17,"tag":32,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":23,"value":237},{"type":23,"value":239},{"type":17,"tag":32,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":23,"value":245},{"type":23,"value":247},{"type":17,"tag":32,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":23,"value":253},{"type":23,"value":255},{"type":17,"tag":32,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":23,"value":261},{"type":23,"value":255},{"type":17,"tag":32,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":23,"value":268},{"type":23,"value":270},{"type":17,"tag":171,"props":1072,"children":1073},{},[1074],{"type":17,"tag":26,"props":1075,"children":1076},{},[1077,1081,1082,1087,1088,1093,1094,1099,1100,1105,1106,1111,1112,1117,1118,1123,1124,1129],{"type":17,"tag":62,"props":1078,"children":1079},{},[1080],{"type":23,"value":281},{"type":23,"value":283},{"type":17,"tag":32,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":23,"value":289},{"type":23,"value":291},{"type":17,"tag":32,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":23,"value":297},{"type":23,"value":299},{"type":17,"tag":32,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":23,"value":305},{"type":23,"value":206},{"type":17,"tag":32,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":23,"value":312},{"type":23,"value":255},{"type":17,"tag":32,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":23,"value":319},{"type":23,"value":321},{"type":17,"tag":32,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":23,"value":245},{"type":23,"value":328},{"type":17,"tag":32,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":23,"value":334},{"type":23,"value":206},{"type":17,"tag":32,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":23,"value":341},{"type":23,"value":343},{"type":17,"tag":41,"props":1131,"children":1132},{},[],{"type":17,"tag":45,"props":1134,"children":1135},{"id":349},[1136],{"type":23,"value":352},{"type":17,"tag":26,"props":1138,"children":1139},{},[1140,1141,1146,1147,1152,1153,1158,1159,1164],{"type":23,"value":357},{"type":17,"tag":32,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":23,"value":37},{"type":23,"value":364},{"type":17,"tag":32,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":23,"value":370},{"type":23,"value":206},{"type":17,"tag":32,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":23,"value":377},{"type":23,"value":379},{"type":17,"tag":32,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":23,"value":385},{"type":23,"value":387},{"type":17,"tag":26,"props":1166,"children":1167},{},[1168,1169,1174,1175,1180,1181,1186,1187,1192,1193,1198],{"type":23,"value":392},{"type":17,"tag":32,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":23,"value":398},{"type":23,"value":400},{"type":17,"tag":32,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":23,"value":406},{"type":23,"value":408},{"type":17,"tag":32,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":23,"value":414},{"type":23,"value":255},{"type":17,"tag":32,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":23,"value":421},{"type":23,"value":423},{"type":17,"tag":32,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":23,"value":429},{"type":23,"value":431},{"type":17,"tag":171,"props":1200,"children":1201},{},[1202],{"type":17,"tag":26,"props":1203,"children":1204},{},[1205,1209],{"type":17,"tag":62,"props":1206,"children":1207},{},[1208],{"type":23,"value":442},{"type":23,"value":444},{"type":17,"tag":41,"props":1211,"children":1212},{},[],{"type":17,"tag":45,"props":1214,"children":1215},{"id":450},[1216],{"type":23,"value":453},{"type":17,"tag":26,"props":1218,"children":1219},{},[1220,1221,1226,1227,1232,1233,1238,1239,1248,1249,1254,1255,1260],{"type":23,"value":458},{"type":17,"tag":32,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":23,"value":464},{"type":23,"value":466},{"type":17,"tag":32,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":23,"value":472},{"type":23,"value":474},{"type":17,"tag":32,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":23,"value":480},{"type":23,"value":482},{"type":17,"tag":484,"props":1240,"children":1241},{},[1242,1247],{"type":17,"tag":32,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":23,"value":492},{"type":23,"value":494},{"type":23,"value":496},{"type":17,"tag":32,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":23,"value":502},{"type":23,"value":504},{"type":17,"tag":32,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":23,"value":510},{"type":23,"value":512},{"type":17,"tag":171,"props":1262,"children":1263},{},[1264],{"type":17,"tag":26,"props":1265,"children":1266},{},[1267,1268,1272,1273,1278,1279,1283],{"type":23,"value":520},{"type":17,"tag":484,"props":1269,"children":1270},{},[1271],{"type":23,"value":525},{"type":23,"value":527},{"type":17,"tag":32,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":23,"value":533},{"type":23,"value":535},{"type":17,"tag":537,"props":1280,"children":1281},{"href":539},[1282],{"type":23,"value":542},{"type":23,"value":544},{"type":17,"tag":41,"props":1285,"children":1286},{},[],{"type":17,"tag":45,"props":1288,"children":1289},{"id":550},[1290],{"type":23,"value":553},{"type":17,"tag":26,"props":1292,"children":1293},{},[1294,1295,1300],{"type":23,"value":558},{"type":17,"tag":32,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":23,"value":37},{"type":23,"value":565},{"type":17,"tag":567,"props":1302,"children":1303},{},[1304,1322],{"type":17,"tag":571,"props":1305,"children":1306},{},[1307],{"type":17,"tag":575,"props":1308,"children":1309},{},[1310,1314,1318],{"type":17,"tag":579,"props":1311,"children":1312},{},[1313],{"type":23,"value":583},{"type":17,"tag":579,"props":1315,"children":1316},{},[1317],{"type":23,"value":588},{"type":17,"tag":579,"props":1319,"children":1320},{},[1321],{"type":23,"value":593},{"type":17,"tag":595,"props":1323,"children":1324},{},[1325,1340,1355,1370],{"type":17,"tag":575,"props":1326,"children":1327},{},[1328,1332,1336],{"type":17,"tag":602,"props":1329,"children":1330},{},[1331],{"type":23,"value":606},{"type":17,"tag":602,"props":1333,"children":1334},{},[1335],{"type":23,"value":611},{"type":17,"tag":602,"props":1337,"children":1338},{},[1339],{"type":23,"value":616},{"type":17,"tag":575,"props":1341,"children":1342},{},[1343,1347,1351],{"type":17,"tag":602,"props":1344,"children":1345},{},[1346],{"type":23,"value":624},{"type":17,"tag":602,"props":1348,"children":1349},{},[1350],{"type":23,"value":629},{"type":17,"tag":602,"props":1352,"children":1353},{},[1354],{"type":23,"value":634},{"type":17,"tag":575,"props":1356,"children":1357},{},[1358,1362,1366],{"type":17,"tag":602,"props":1359,"children":1360},{},[1361],{"type":23,"value":642},{"type":17,"tag":602,"props":1363,"children":1364},{},[1365],{"type":23,"value":647},{"type":17,"tag":602,"props":1367,"children":1368},{},[1369],{"type":23,"value":652},{"type":17,"tag":575,"props":1371,"children":1372},{},[1373,1377,1385],{"type":17,"tag":602,"props":1374,"children":1375},{},[1376],{"type":23,"value":660},{"type":17,"tag":602,"props":1378,"children":1379},{},[1380],{"type":17,"tag":32,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":23,"value":37},{"type":17,"tag":602,"props":1386,"children":1387},{},[1388],{"type":23,"value":673},{"type":17,"tag":41,"props":1390,"children":1391},{},[],{"type":17,"tag":45,"props":1393,"children":1394},{"id":679},[1395],{"type":23,"value":682},{"type":17,"tag":684,"props":1397,"children":1398},{},[1399,1407,1415,1423,1431,1439],{"type":17,"tag":688,"props":1400,"children":1401},{},[1402,1406],{"type":17,"tag":484,"props":1403,"children":1404},{},[1405],{"type":23,"value":695},{"type":23,"value":697},{"type":17,"tag":688,"props":1408,"children":1409},{},[1410,1414],{"type":17,"tag":484,"props":1411,"children":1412},{},[1413],{"type":23,"value":705},{"type":23,"value":707},{"type":17,"tag":688,"props":1416,"children":1417},{},[1418,1422],{"type":17,"tag":484,"props":1419,"children":1420},{},[1421],{"type":23,"value":715},{"type":23,"value":717},{"type":17,"tag":688,"props":1424,"children":1425},{},[1426,1430],{"type":17,"tag":484,"props":1427,"children":1428},{},[1429],{"type":23,"value":725},{"type":23,"value":727},{"type":17,"tag":688,"props":1432,"children":1433},{},[1434,1438],{"type":17,"tag":484,"props":1435,"children":1436},{},[1437],{"type":23,"value":735},{"type":23,"value":737},{"type":17,"tag":688,"props":1440,"children":1441},{},[1442,1446,1447,1452],{"type":17,"tag":484,"props":1443,"children":1444},{},[1445],{"type":23,"value":745},{"type":23,"value":747},{"type":17,"tag":32,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":23,"value":753},{"type":23,"value":755},{"type":17,"tag":41,"props":1454,"children":1455},{},[],{"type":17,"tag":45,"props":1457,"children":1458},{"id":761},[1459],{"type":23,"value":764},{"type":17,"tag":171,"props":1461,"children":1462},{},[1463],{"type":17,"tag":26,"props":1464,"children":1465},{},[1466,1470,1471,1476,1477,1482,1483,1488],{"type":17,"tag":62,"props":1467,"children":1468},{},[1469],{"type":23,"value":442},{"type":23,"value":776},{"type":17,"tag":32,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":23,"value":377},{"type":23,"value":783},{"type":17,"tag":32,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":23,"value":385},{"type":23,"value":790},{"type":17,"tag":32,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":23,"value":429},{"type":23,"value":797},{"type":17,"tag":26,"props":1490,"children":1491},{},[1492,1496,1497,1502,1503,1508,1509,1514,1515,1520,1521,1526,1527,1532,1533,1538],{"type":17,"tag":484,"props":1493,"children":1494},{},[1495],{"type":23,"value":805},{"type":23,"value":807},{"type":17,"tag":32,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":23,"value":813},{"type":23,"value":255},{"type":17,"tag":32,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":23,"value":820},{"type":23,"value":206},{"type":17,"tag":32,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":23,"value":827},{"type":23,"value":255},{"type":17,"tag":32,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":23,"value":834},{"type":23,"value":255},{"type":17,"tag":32,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":23,"value":841},{"type":23,"value":255},{"type":17,"tag":32,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":23,"value":848},{"type":23,"value":206},{"type":17,"tag":32,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":23,"value":855},{"type":23,"value":544},{"type":17,"tag":858,"props":1540,"children":1541},{},[1542],{"type":23,"value":862},{"title":7,"searchDepth":75,"depth":75,"links":1544},[1545,1546,1547,1548,1549,1550,1551],{"id":47,"depth":75,"text":50},{"id":166,"depth":75,"text":169},{"id":349,"depth":75,"text":352},{"id":450,"depth":75,"text":453},{"id":550,"depth":75,"text":553},{"id":679,"depth":75,"text":682},{"id":761,"depth":75,"text":764},1786664016777]