ScriptX MCP 工作区与运行时工具
ScriptX MCP 工作区与运行时工具
这一组工具负责读取和修改 ScriptX 项目与 App Script、启动目标应用、检查 Hook 状态、读取运行日志,以及捕获当前屏幕和无障碍节点。
当前源码注册 15 个工具。本页每个二级标题都对应一个可直接调用的 MCP 工具;工具名和参数名区分大小写。
调用前提
- 这里记录的是 ScriptX 设置页启动的内置 MCP 服务,不是脚本侧用于自建服务的
mcpServer对象。 - 返回对象以
ok表示业务是否成功,message给出可读原因,具体数据位于result。HTTP 请求成功不等于工具执行成功。 - 需要 APK 工作区的工具,应先调用
get_analysis_state或list_apk_workspaces,再使用返回的真实projectDir。 - 带
confirm的安装、卸载、停止、导入等操作必须明确传true,避免外部 Agent 在未确认时产生副作用。
captureAccessibilitySnapshot
捕获当前可分析窗口的无障碍快照,返回窗口信息、节点树和相关元数据。
显示名称:捕获无障碍快照
参数
| 参数 | 类型 | 必填 | 可填值 / 范围 | 说明 |
|---|---|---|---|---|
windowId | number | 否 | - | 可选的目标窗口 ID;不传时使用当前活跃窗口。 |
返回值
返回统一 MCP 结果对象:ok 表示调用是否成功,message 是可读说明,具体数据放在 result。分析尚未准备好、后端安装中或需要先缓存 APK 时,ok 可能为 false,应先读 message 与 result 中的状态字段再决定下一步。
示例
{"name":"captureAccessibilitySnapshot","arguments":{"windowId":12}}
captureScreenshot
截取当前设备屏幕,返回 PNG 图像与宽高信息。
显示名称:捕获截图
参数
| 参数 | 类型 | 必填 | 可填值 / 范围 | 说明 |
|---|---|---|---|---|
includeBase64 | boolean | 否 | true / false;默认 false | 是否同时返回 contentBase64,默认 false。 |
返回值
返回统一 MCP 结果对象:ok 表示调用是否成功,message 是可读说明,具体数据放在 result。分析尚未准备好、后端安装中或需要先缓存 APK 时,ok 可能为 false,应先读 message 与 result 中的状态字段再决定下一步。
示例
{"name":"captureScreenshot","arguments":{"includeBase64":false}}
clearRuntimeLogs
用途
把当前运行日志和 Probe 线索一起清空,适合重新调试前先“清台面”。
参数
这个工具没有参数。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
runtimeLogsCleared | boolean | 运行日志是否已清空;正常成功时应为 true |
probeLogsCleared | boolean | Probe 线索是否已清空;正常成功时应为 true |
示例
{
"name": "clearRuntimeLogs",
"arguments": {}
}
返回示例
{
"ok": true,
"message": "运行日志已清空",
"result": {
"runtimeLogsCleared": true,
"probeLogsCleared": true
}
}
补充说明
- 这是清空动作,不是筛选动作。
- 清完之后再抓日志,更容易看清楚“本次操作到底打出了哪些新日志”。
createDirectory
用途
在项目里创建目录,常用于先把模块目录搭出来,比如 utils/crypto、pages/login、lib/http。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
projectName | string | 是 | 已存在的项目名 | 目标项目 |
path | string | 是 | 项目内相对目录路径 | 可以是多级目录 |
行为细节
path必须是项目内相对路径。- 路径越界会报错,不允许跳出项目根目录。
- 多级目录会一起创建。
- 如果目录本来就已经存在,当前实现也会按成功返回,不会因为“已存在”而报错。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
projectName | string | 本次创建目录所属的项目名 |
path | string | 新目录的本地绝对路径;实际位于 /data/local/tmp/JSXHook/Project/... |
relativePath | string | 你传入的项目内相对目录路径 |
示例
{
"name": "createDirectory",
"arguments": {
"projectName": "Demo",
"path": "utils/crypto"
}
}
返回示例
{
"ok": true,
"message": "目录已创建",
"result": {
"projectName": "Demo",
"path": "/data/local/tmp/JSXHook/Project/Demo/utils/crypto",
"relativePath": "utils/crypto"
}
}
补充说明
- 这个工具只创建目录,不会顺便创建文件。
getHookState
用途
看当前 Hook 环境是不是通的,框架名和版本是什么,目标包有没有进作用域,最近有没有 Probe 线索和错误。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
packageName | string | 否 | 包名 | 直接指定目标包 |
appName | string | 否 | 应用名 | 用它解析目标包 |
targetType | string | 否 | 常用 project | 文案里主要写了 project;当前实现也能容忍 app / appScript 形式 |
projectName | string | 否 | 项目名 | targetType=project 时可用 |
行为细节
- 这个工具可以不传任何参数,当成“全局环境诊断”来用。
- 如果你传了目标,但目标包解析失败,这个工具也不一定直接抛错;它可能仍然返回全局状态,只是
targetPackage为null。
返回字段
| 字段 | 类型 | 典型值 | 说明 |
|---|---|---|---|
shellMode | string | 例如某个 Shell 模式枚举名 | 当前用于执行 shell 的模式名,主要给你排查“为什么 shell 行为不一致” |
serviceConnected | boolean | true / false | 当前 Xposed / LSPosed 侧服务是否已连上 |
targetPackage | string | null | org.autojs.autojspro | 本次诊断针对的目标包;没传目标或目标解析失败时可能是 null |
targetScopeGranted | boolean | null | true / false / null | 目标包是否已经在当前授予作用域里;只有 targetPackage 有值时才真正有意义 |
grantedScope | string[] | 包名数组 | 当前框架已授予的全部包名列表 |
frameworkName | string | null | 例如某个框架名 | 当前读取到的框架名称;读不到时为 null |
frameworkVersion | string | null | 例如版本号字符串 | 当前读取到的框架版本;读不到时为 null |
lastProbeLine | string | 一条 Probe 日志 | 最近一条 Probe 线索;没有时通常是空字符串 |
lastHookProbeLine | string | 一条 Hook Probe 日志 | 最近一条更偏 Hook 侧的 Probe 线索;没有时通常为空 |
lastErrorLine | string | 一条错误日志 | 最近一条错误相关日志;没有时通常为空字符串 |
recentErrors | string[] | 最多 12 条 | 最近筛出来的错误日志数组,当前实现只取末尾最多 12 条 |
lastRequestStatus | string | IDLE、APPROVED 等 | 最近一次作用域请求状态 |
lastRequestMessage | string | 任意文本 | 最近一次作用域请求的附带说明、错误信息或状态说明;没有时为空字符串 |
lastRequestStatus 可选值
这个字段不是随便拼出来的字符串,而是源码里的枚举值,当前可选项有:
IDLE:还没有发生过明确的作用域请求REQUESTING:正在请求作用域APPROVED:请求已通过FAILED:请求失败SERVICE_UNAVAILABLE:服务当前不可用ERROR:出现异常
示例
直接看全局状态:
{
"name": "getHookState",
"arguments": {}
}
看某个宿主包的作用域状态:
{
"name": "getHookState",
"arguments": {
"packageName": "org.autojs.autojspro"
}
}
返回示例
{
"ok": true,
"message": "Hook 状态已返回",
"result": {
"shellMode": "ROOT",
"serviceConnected": true,
"targetPackage": "org.autojs.autojspro",
"targetScopeGranted": true,
"grantedScope": [
"org.autojs.autojspro",
"com.example.demo"
],
"frameworkName": "LSPosed",
"frameworkVersion": "1.9.3",
"lastProbeLine": "[Probe] login() entered",
"lastHookProbeLine": "[HookProbe] before invoke login",
"lastErrorLine": "",
"recentErrors": [],
"lastRequestStatus": "APPROVED",
"lastRequestMessage": "Scope already granted"
}
}
补充说明
targetScopeGranted只有在成功解析出目标包时才有意义;没目标时通常是null。- 这个工具很适合排查“脚本写了但为什么没有实际 Hook 到”的问题。
getRuntimeLogs
用途
读取最近的运行日志,还可以把 Probe 线索一起带回来。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
limit | number | 否 | 默认 80,实际会被限制在 1 到 400 | 最多返回多少条 |
keyword | string | 否 | 任意关键字 | 按关键字过滤 |
packageName | string | 否 | 包名 | 按包名过滤 |
appName | string | 否 | 应用名 | 不传 packageName 时可用它解析包名 |
includeProbe | boolean | 否 | 默认 false | 是否把 Probe 日志也一起返回 |
行为细节
packageName和appName同时传时,packageName优先。appName解析规则和前面一样,存在模糊匹配与多结果报错的情况。- 内部读取日志时,不是扫描无限历史,而是先取一批最近可见日志,再做过滤。
- 当前实现有一个很关键的小细节:
如果你指定了packageName,但过滤后一条都没有,它会回退成“只按关键字过滤”,而不是死板地返回空数组。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
packageName | string | null | 实际用于过滤的包名;没传或没解析成功时可能为 null |
keyword | string | null | 实际用于过滤的关键字;没传时为 null |
runtimeLogs | string[] | 过滤后的运行日志数组;当前实现返回的是过滤结果里的末尾最多 limit 条 |
probeLogs | string[] | 过滤后的 Probe 日志数组;只有 includeProbe=true 时才会有内容 |
示例
读取某个宿主最近 100 条日志并带上 Probe:
{
"name": "getRuntimeLogs",
"arguments": {
"packageName": "org.autojs.autojspro",
"limit": 100,
"includeProbe": true
}
}
按关键字筛日志:
{
"name": "getRuntimeLogs",
"arguments": {
"keyword": "login",
"limit": 50
}
}
返回示例
{
"ok": true,
"message": "运行日志已返回",
"result": {
"packageName": "org.autojs.autojspro",
"keyword": "login",
"runtimeLogs": [
"[JSXHook][Info] login start",
"[JSXHook][Info] login success"
],
"probeLogs": [
"[Probe] enter login()"
]
}
}
补充说明
includeProbe=false时,probeLogs通常就是空数组。limit超过 400 也不会真的返回 400 以上,内部会被压到 400。
launchTargetApp
用途
按项目、多脚本或直接按包名/应用名启动宿主应用。启动前会先尝试 am force-stop,然后再拉起宿主。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
targetType | string | 否 | 默认 app | 可填 project、appScript、app;实现层还兼容 appscript、app_script、app-script |
projectName | string | 条件必填 | 项目名 | targetType=project 时使用 |
packageName | string | 条件必填 | 包名 | targetType=app / appScript 时可用;project 时也可作为覆盖值 |
appName | string | 条件必填 | 应用名 | 可用来解析包名 |
目标解析规则
targetType=project时,宿主包名的选择顺序是:- 你显式传入的
packageName - 项目的
launcher - 项目
scope里第一个不等于all的包名
- 你显式传入的
targetType=appScript时,会按packageName/appName解析宿主。targetType=app或不传targetType时,也是按packageName/appName解析。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
packageName | string | 最终用于启动的宿主包名 |
appName | string | 最终解析出的宿主应用显示名 |
component | string | 最终启动的 package/activity 组件短名 |
launchMethod | string | 当前实现常见值是 shell_am_start 或 context_startActivity |
shellMode | string | 当前执行 shell 的模式名 |
forceStopOk | boolean | 启动前那次 am force-stop 是否成功;它不等于“应用一定成功启动” |
shellOutput | string | null | shell 启动输出;可能是 am start -W 的返回文本,也可能为空 |
launchMethod 常见值
shell_am_start:通过 shell 的am start -W成功启动context_startActivity:shell 方式不理想或失败后,回退到context.startActivity(...)
示例
按项目启动:
{
"name": "launchTargetApp",
"arguments": {
"targetType": "project",
"projectName": "Demo"
}
}
按包名直接启动:
{
"name": "launchTargetApp",
"arguments": {
"packageName": "org.autojs.autojspro"
}
}
返回示例
{
"ok": true,
"message": "宿主应用已启动",
"result": {
"packageName": "org.autojs.autojspro",
"appName": "Auto.js",
"component": "org.autojs.autojspro/.ui.splash.SplashActivity",
"launchMethod": "shell_am_start",
"shellMode": "ROOT",
"forceStopOk": true,
"shellOutput": "Status: ok"
}
}
补充说明
- 这个工具不是“单纯 startActivity 一下”,它会先强停,再尽量用 shell 的
am start -W启动。 - 如果 shell 启动失败,会回退到
context.startActivity(...)。 - 如果宿主没有 launcher Activity,或者系统无法解析启动 Intent,会报错。
listAppScripts
用途
查看多脚本管理里有哪些宿主应用,以及每个宿主下面挂了哪些脚本。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
packageName | string | 否 | 宿主应用包名 | 精确指定某个宿主应用 |
appName | string | 否 | 应用名关键字 | 不传 packageName 时可用它匹配应用 |
参数规则
packageName和appName同时传时,packageName优先。- 两个都不传时,会读取当前多脚本配置里已经登记过的宿主应用列表。
appName的匹配顺序是:- 先把它当包名精确匹配
- 再把它当应用名精确匹配
- 最后做包含式模糊匹配
- 如果模糊匹配到多个应用,会直接报错,不会擅自帮你选一个。
顶层 result 字段
| 字段 | 类型 | 说明 |
|---|---|---|
apps | object[] | 多脚本宿主应用数组;每个元素代表一个宿主应用及其脚本列表 |
apps[] 字段
| 字段 | 类型 | 说明 |
|---|---|---|
packageName | string | 宿主应用包名 |
appName | string | 宿主应用显示名 |
scripts | object[] | 这个宿主下面登记的脚本数组 |
apps[].scripts[] 字段
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 脚本名,不一定带 .js 后缀 |
enabled | boolean | 当前脚本是否启用 |
description | string | 脚本说明;没填时可能是空字符串 |
version | string | 当前脚本版本标记;常见会看到 v1.0 |
path | string | 工作区里的脚本相对路径;实际常见形如 /AppScript/包名/脚本名.js |
示例
按应用名筛一个宿主:
{
"name": "listAppScripts",
"arguments": {
"appName": "Auto.js"
}
}
按包名精确筛:
{
"name": "listAppScripts",
"arguments": {
"packageName": "org.autojs.autojspro"
}
}
返回示例
{
"ok": true,
"message": "已返回多脚本列表",
"result": {
"apps": [
{
"packageName": "org.autojs.autojspro",
"appName": "Auto.js",
"scripts": [
{
"name": "demo",
"enabled": true,
"description": "登录流程示例",
"version": "v1.0",
"path": "/AppScript/org.autojs.autojspro/demo.js"
}
]
}
]
}
}
补充说明
- 如果当前没有配置任何多脚本宿主,可能会返回空列表。
- 这个工具不会读取脚本正文,只列出配置与路径。
listProjectFiles
返回指定 ScriptX Project 目录下的全部文件相对路径,便于同步或拉取整个项目源码。
显示名称:列出项目文件
参数
| 参数 | 类型 | 必填 | 可填值 / 范围 | 说明 |
|---|---|---|---|---|
projectName | string | 是 | - | 项目名。 |
返回值
返回统一 MCP 结果对象:ok 表示调用是否成功,message 是可读说明,具体数据放在 result。分析尚未准备好、后端安装中或需要先缓存 APK 时,ok 可能为 false,应先读 message 与 result 中的状态字段再决定下一步。
示例
{"name":"listProjectFiles","arguments":{"projectName":"Demo"}}
listProjects
用途
列出当前 ScriptX 工作区里的所有项目。适合先摸底“现在本机工作区里到底有哪些项目、作用域写了什么、启动宿主指向谁”。
参数
这个工具没有参数。
顶层 result 字段
| 字段 | 类型 | 说明 |
|---|---|---|
projects | object[] | 当前工作区里的项目数组 |
projects[] 字段
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 项目名 |
enabled | boolean | 项目当前是否启用 |
author | string | 项目作者;没写时可能是空字符串 |
description | string | 项目描述;没写时可能是空字符串 |
scope | string[] | 项目作用域列表;常见是具体包名数组,也可能包含 all |
launcher | string | 项目显式指定的宿主包名;为空字符串时表示没有单独指定 |
initPath | string | 项目 init.js 的工作区相对路径;实际常见形如 /Project/项目名/init.js |
mainPath | string | 项目 main.js 的工作区相对路径;实际常见形如 /Project/项目名/main.js |
示例
{
"name": "listProjects",
"arguments": {}
}
返回示例
{
"ok": true,
"message": "已返回项目列表",
"result": {
"projects": [
{
"name": "Demo",
"enabled": true,
"author": "admin",
"description": "示例项目",
"scope": [
"org.autojs.autojspro"
],
"launcher": "org.autojs.autojspro",
"initPath": "/Project/Demo/init.js",
"mainPath": "/Project/Demo/main.js"
}
]
}
}
补充说明
- 如果返回
projects: [],表示当前工作区里还没有项目。 - 这个工具只读,不会修改任何内容。
readCode
用途
读取项目文件或多脚本文件内容,并同时返回纯文本和 Base64,方便 MCP 客户端后续继续编辑或转存。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
targetType | string | 是 | project、appScript | 目标类型。代码层还兼容 appscript、app_script、app-script |
projectName | string | 条件必填 | 项目名 | targetType=project 时必填 |
file | string | 否 | 默认 main.js | 仅 project 使用;支持 main、main.js、init、init.js、以及任意项目内相对路径 |
packageName | string | 条件必填 | 包名 | targetType=appScript 时可用 |
appName | string | 条件必填 | 应用名 | targetType=appScript 时可用;和 packageName 二选一即可 |
scriptName | string | 条件必填 | 脚本名 | targetType=appScript 时必填,写不写 .js 都行 |
参数规则
targetType=project时,必须给projectName。targetType=appScript时,必须能解析出宿主应用包名,并且必须给scriptName。file留空时,默认就是项目根下的main.js。scriptName末尾如果写了.js,内部会自动去掉后缀再定位脚本。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
targetType | string | 返回值不是你传入的原样字符串,而是内部解析后的目标类型;当前实际常见值是 project 或 app_script |
projectName | string | null | 目标是项目文件时有值;多脚本时通常为 null |
packageName | string | null | 目标是多脚本时有值;项目文件时通常为 null |
appName | string | null | 目标是多脚本时,解析出来的宿主应用显示名 |
scriptName | string | null | 目标是多脚本时,解析后的脚本名 |
path | string | 本地绝对路径;实际就是 /data/local/tmp/JSXHook/... 下面的真实文件 |
relativePath | string | 相对路径;项目目标时是项目内相对路径,如 modules/test.js,多脚本目标时常见是 /AppScript/... |
content | string | UTF-8 正文文本 |
contentBase64 | string | 同一份 content 的 Base64 版本 |
示例
读取项目 main.js:
{
"name": "readCode",
"arguments": {
"targetType": "project",
"projectName": "Demo"
}
}
读取项目 init.js:
{
"name": "readCode",
"arguments": {
"targetType": "project",
"projectName": "Demo",
"file": "init"
}
}
读取多脚本:
{
"name": "readCode",
"arguments": {
"targetType": "appScript",
"packageName": "org.autojs.autojspro",
"scriptName": "demo"
}
}
返回示例
{
"ok": true,
"message": "代码已读取",
"result": {
"targetType": "app_script",
"projectName": null,
"packageName": "org.autojs.autojspro",
"appName": "Auto.js",
"scriptName": "demo",
"path": "/data/local/tmp/JSXHook/AppScript/org.autojs.autojspro/demo.js",
"relativePath": "/AppScript/org.autojs.autojspro/demo.js",
"content": "toast('ok');",
"contentBase64": "dG9hc3QoJ29rJyk7"
}
}
补充说明
- 项目文件路径会被限制在该项目目录内部,越界路径会直接报错。
- 多脚本读取时,如果脚本不存在,会报
未找到脚本 ...。
replaceCode
用途
在已有代码里做字符串替换。适合小范围修补,不适合大改结构。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
targetType | string | 是 | project、appScript | 目标类型;代码层还兼容 appscript、app_script、app-script |
projectName | string | 条件必填 | 项目名 | targetType=project 时必填 |
file | string | 否 | 默认 main.js | 仅 project 使用 |
packageName | string | 条件必填 | 包名 | targetType=appScript 时可用 |
appName | string | 条件必填 | 应用名 | targetType=appScript 时可用 |
scriptName | string | 条件必填 | 脚本名 | targetType=appScript 时必填 |
search | string | 是 | 非空字符串 | 要查找的原始文本 |
replace | string | 是 | 任意字符串 | 替换后的文本;可以是空字符串,表示删除 |
replaceAll | boolean | 否 | 默认 false | 是否替换全部匹配 |
行为细节
replaceAll=false时,只替换第一个匹配。replaceAll=true时,替换全部匹配。- 匹配方式是普通字符串匹配,不是正则。
- 如果找不到
search,会直接报错,不会静默成功。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
path | string | 被替换文件的本地绝对路径 |
replacedAll | boolean | 表示本次是否按“全量替换模式”执行;它表示执行模式,不表示到底替换了多少处 |
示例
只替换第一个:
{
"name": "replaceCode",
"arguments": {
"targetType": "project",
"projectName": "Demo",
"search": "foo()",
"replace": "bar()"
}
}
返回示例
{
"ok": true,
"message": "代码已替换",
"result": {
"path": "/data/local/tmp/JSXHook/Project/Demo/main.js",
"replacedAll": true
}
}
全部替换:
{
"name": "replaceCode",
"arguments": {
"targetType": "project",
"projectName": "Demo",
"search": "debug = true",
"replace": "debug = false",
"replaceAll": true
}
}
补充说明
- 这个工具内部会先完整读取原文件,再替换,再整文件写回。
- 要做复杂重构时,更适合先
readCode再由 Agent 或脚本生成新内容后配合writeCode。
runNoHostScript
直接在 ScriptX 自身进程中运行项目文件或多脚本文件,不会启动宿主应用。
显示名称:无宿主运行脚本
参数
| 参数 | 类型 | 必填 | 可填值 / 范围 | 说明 |
|---|---|---|---|---|
targetType | string | 是 | project / appScript | project 或 appScript。 |
projectName | string | 否 | - | 当 targetType=project 时填写项目名。 |
file | string | 否 | - | 项目内相对文件路径,默认 main.js。 |
packageName | string | 否 | - | 当 targetType=appScript 时填写包名。 |
appName | string | 否 | - | 当 targetType=appScript 时也可填写应用名。 |
scriptName | string | 否 | - | 当 targetType=appScript 时填写脚本名。 |
返回值
返回统一 MCP 结果对象:ok 表示调用是否成功,message 是可读说明,具体数据放在 result。分析尚未准备好、后端安装中或需要先缓存 APK 时,ok 可能为 false,应先读 message 与 result 中的状态字段再决定下一步。
示例
{"name":"runNoHostScript","arguments":{"targetType":"appScript","packageName":"com.tencent.mobileqq","scriptName":"提取GUID"}}
stopNoHostScript
停止当前项目文件或多脚本文件对应的无宿主运行会话。
显示名称:停止无宿主运行
参数
| 参数 | 类型 | 必填 | 可填值 / 范围 | 说明 |
|---|---|---|---|---|
targetType | string | 是 | project / appScript | project 或 appScript。 |
projectName | string | 否 | - | 当 targetType=project 时填写项目名。 |
file | string | 否 | - | 项目内相对文件路径,默认 main.js。 |
packageName | string | 否 | - | 当 targetType=appScript 时填写包名。 |
appName | string | 否 | - | 当 targetType=appScript 时也可填写应用名。 |
scriptName | string | 否 | - | 当 targetType=appScript 时填写脚本名。 |
返回值
返回统一 MCP 结果对象:ok 表示调用是否成功,message 是可读说明,具体数据放在 result。分析尚未准备好、后端安装中或需要先缓存 APK 时,ok 可能为 false,应先读 message 与 result 中的状态字段再决定下一步。
示例
{"name":"stopNoHostScript","arguments":{"targetType":"project","projectName":"Demo","file":"main.js"}}
writeCode
用途
写入项目文件或多脚本文件。这个工具既可以改已有文件,也可以新建项目内文件或多脚本。
参数
| 参数 | 类型 | 必填 | 可填值 / 默认 | 说明 |
|---|---|---|---|---|
targetType | string | 是 | project、appScript | 代码层还兼容 appscript、app_script、app-script |
projectName | string | 条件必填 | 项目名 | targetType=project 时必填 |
file | string | 否 | 默认 main.js | 仅 project 使用 |
packageName | string | 条件必填 | 包名 | targetType=appScript 时可用 |
appName | string | 条件必填 | 应用名 | targetType=appScript 时可用 |
scriptName | string | 条件必填 | 脚本名 | targetType=appScript 时必填 |
content | string | 三选一 | 纯文本 | 适合短内容 |
contentBase64 | string | 三选一 | Base64 文本 | 适合长代码 |
lines | array | 三选一 | 字符串数组 | 会按换行拼接成文本 |
description | string | 否 | 仅多脚本有效 | 创建或更新多脚本描述 |
enabled | boolean | 否 | 仅多脚本有效 | 创建或更新多脚本启用状态 |
内容优先级
如果你同时传了多种写入内容,内部优先级是:
contentcontentBase64lines
所以实际使用时,最好只传其中一种,避免自己以为写进去的是 A,实际生效的是 B。
行为细节
- 写项目文件时,如果父目录不存在,会自动创建父目录。
- 写多脚本时,如果脚本还不存在,会直接创建。
- 写多脚本时,
description和enabled会写回脚本配置。 - 新建多脚本配置时,如果没有旧版本号,会默认写成
v1.0。 - 新建多脚本时,如果你没显式传
enabled,当前实现会沿用旧值;如果连旧配置都没有,默认等价于启用状态true。 - 新建多脚本时,如果你没传
description,默认是空字符串。 enabled这里最好传真正的 JSON 布尔值;字符串"false"在当前实现里不会按布尔覆盖处理。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
path | string | 写入目标的本地绝对路径 |
relativePath | string | 写入目标的相对路径;项目目标时是项目内相对路径,多脚本目标时常见是 /AppScript/... |
size | number | 本次写入内容的字符长度;注意这里是字符串长度,不是文件字节数 |
示例
直接写项目 main.js:
{
"name": "writeCode",
"arguments": {
"targetType": "project",
"projectName": "Demo",
"content": "log('hello');"
}
}
返回示例
{
"ok": true,
"message": "代码已写入",
"result": {
"path": "/data/local/tmp/JSXHook/AppScript/org.autojs.autojspro/mcp-demo.js",
"relativePath": "/AppScript/org.autojs.autojspro/mcp-demo.js",
"size": 12
}
}
按行写项目文件:
{
"name": "writeCode",
"arguments": {
"targetType": "project",
"projectName": "Demo",
"file": "modules/test.js",
"lines": [
"function test() {",
" return 1;",
"}"
]
}
}
创建多脚本并启用:
{
"name": "writeCode",
"arguments": {
"targetType": "appScript",
"packageName": "org.autojs.autojspro",
"scriptName": "mcp-demo",
"content": "toast('ok');",
"description": "MCP 写入示例",
"enabled": true
}
}
补充说明
- 如果
content、contentBase64、lines一个都不传,会直接报错。 contentBase64传错格式时,解码会失败。
