@zenalexa/unicli 0.210.0 → 0.212.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +71 -134
- package/README.md +222 -209
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +114 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +14 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +41 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/agents.d.ts +14 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +369 -140
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +14 -0
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/lint.d.ts +32 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +377 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -4
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +47 -62
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/migrate-schema.d.ts +56 -0
- package/dist/commands/migrate-schema.d.ts.map +1 -0
- package/dist/commands/migrate-schema.js +522 -0
- package/dist/commands/migrate-schema.js.map +1 -0
- package/dist/commands/migrate.d.ts +54 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +270 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +72 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +47 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +76 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/envelope.d.ts +87 -0
- package/dist/core/envelope.d.ts.map +1 -0
- package/dist/core/envelope.js +94 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/registry.d.ts +63 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +62 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/schema-v2.d.ts +111 -0
- package/dist/core/schema-v2.d.ts.map +1 -0
- package/dist/core/schema-v2.js +118 -0
- package/dist/core/schema-v2.js.map +1 -0
- package/dist/core/types.d.ts +24 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +15 -0
- package/dist/core/types.js.map +1 -0
- package/dist/discovery/aliases.d.ts +36 -0
- package/dist/discovery/aliases.d.ts.map +1 -0
- package/dist/discovery/aliases.js +520 -0
- package/dist/discovery/aliases.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +107 -5
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts +73 -0
- package/dist/discovery/search.d.ts.map +1 -0
- package/dist/discovery/search.js +392 -0
- package/dist/discovery/search.js.map +1 -0
- package/dist/engine/repair/logger.d.ts.map +1 -1
- package/dist/engine/repair/logger.js +11 -1
- package/dist/engine/repair/logger.js.map +1 -1
- package/dist/engine/steps/browser.d.ts +11 -0
- package/dist/engine/steps/browser.d.ts.map +1 -0
- package/dist/engine/steps/browser.js +11 -0
- package/dist/engine/steps/browser.js.map +1 -0
- package/dist/engine/steps/control.d.ts +10 -0
- package/dist/engine/steps/control.d.ts.map +1 -0
- package/dist/engine/steps/control.js +10 -0
- package/dist/engine/steps/control.js.map +1 -0
- package/dist/engine/steps/cua.d.ts +53 -0
- package/dist/engine/steps/cua.d.ts.map +1 -0
- package/dist/engine/steps/cua.js +71 -0
- package/dist/engine/steps/cua.js.map +1 -0
- package/dist/engine/steps/desktop-ax.d.ts +38 -0
- package/dist/engine/steps/desktop-ax.d.ts.map +1 -0
- package/dist/engine/steps/desktop-ax.js +49 -0
- package/dist/engine/steps/desktop-ax.js.map +1 -0
- package/dist/engine/steps/desktop.d.ts +10 -0
- package/dist/engine/steps/desktop.d.ts.map +1 -0
- package/dist/engine/steps/desktop.js +10 -0
- package/dist/engine/steps/desktop.js.map +1 -0
- package/dist/engine/steps/download.d.ts +10 -0
- package/dist/engine/steps/download.d.ts.map +1 -0
- package/dist/engine/steps/download.js +10 -0
- package/dist/engine/steps/download.js.map +1 -0
- package/dist/engine/steps/fetch.d.ts +10 -0
- package/dist/engine/steps/fetch.d.ts.map +1 -0
- package/dist/engine/steps/fetch.js +10 -0
- package/dist/engine/steps/fetch.js.map +1 -0
- package/dist/engine/steps/index.d.ts +19 -0
- package/dist/engine/steps/index.d.ts.map +1 -0
- package/dist/engine/steps/index.js +19 -0
- package/dist/engine/steps/index.js.map +1 -0
- package/dist/engine/steps/transform.d.ts +10 -0
- package/dist/engine/steps/transform.d.ts.map +1 -0
- package/dist/engine/steps/transform.js +10 -0
- package/dist/engine/steps/transform.js.map +1 -0
- package/dist/engine/steps/websocket.d.ts +10 -0
- package/dist/engine/steps/websocket.d.ts.map +1 -0
- package/dist/engine/steps/websocket.js +10 -0
- package/dist/engine/steps/websocket.js.map +1 -0
- package/dist/engine/yaml-runner.d.ts +159 -1
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +180 -32
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/manifest-compact.txt +15 -0
- package/dist/manifest-search.json +1 -0
- package/dist/manifest.json +530 -244
- package/dist/mcp/elicitation.d.ts +56 -0
- package/dist/mcp/elicitation.d.ts.map +1 -0
- package/dist/mcp/elicitation.js +62 -0
- package/dist/mcp/elicitation.js.map +1 -0
- package/dist/mcp/oauth.d.ts +33 -0
- package/dist/mcp/oauth.d.ts.map +1 -0
- package/dist/mcp/oauth.js +291 -0
- package/dist/mcp/oauth.js.map +1 -0
- package/dist/mcp/schema.d.ts +65 -0
- package/dist/mcp/schema.d.ts.map +1 -0
- package/dist/mcp/schema.js +136 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +28 -10
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +408 -234
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sse-transport.d.ts +34 -0
- package/dist/mcp/sse-transport.d.ts.map +1 -0
- package/dist/mcp/sse-transport.js +182 -0
- package/dist/mcp/sse-transport.js.map +1 -0
- package/dist/mcp/streamable-http.d.ts +89 -0
- package/dist/mcp/streamable-http.d.ts.map +1 -0
- package/dist/mcp/streamable-http.js +566 -0
- package/dist/mcp/streamable-http.js.map +1 -0
- package/dist/output/formatter.d.ts +14 -4
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +49 -25
- package/dist/output/formatter.js.map +1 -1
- package/dist/permissions/sensitive-paths.js +2 -2
- package/dist/permissions/sensitive-paths.js.map +1 -1
- package/dist/protocol/acp.d.ts +126 -0
- package/dist/protocol/acp.d.ts.map +1 -0
- package/dist/protocol/acp.js +588 -0
- package/dist/protocol/acp.js.map +1 -0
- package/dist/protocol/skill.d.ts +106 -0
- package/dist/protocol/skill.d.ts.map +1 -0
- package/dist/protocol/skill.js +276 -0
- package/dist/protocol/skill.js.map +1 -0
- package/dist/registry.d.ts +2 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -1
- package/dist/transport/adapters/cdp-browser.d.ts +44 -0
- package/dist/transport/adapters/cdp-browser.d.ts.map +1 -0
- package/dist/transport/adapters/cdp-browser.js +240 -0
- package/dist/transport/adapters/cdp-browser.js.map +1 -0
- package/dist/transport/adapters/cua.d.ts +240 -0
- package/dist/transport/adapters/cua.d.ts.map +1 -0
- package/dist/transport/adapters/cua.js +663 -0
- package/dist/transport/adapters/cua.js.map +1 -0
- package/dist/transport/adapters/desktop-atspi.d.ts +27 -0
- package/dist/transport/adapters/desktop-atspi.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-atspi.js +65 -0
- package/dist/transport/adapters/desktop-atspi.js.map +1 -0
- package/dist/transport/adapters/desktop-ax.d.ts +59 -0
- package/dist/transport/adapters/desktop-ax.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-ax.js +311 -0
- package/dist/transport/adapters/desktop-ax.js.map +1 -0
- package/dist/transport/adapters/desktop-uia.d.ts +27 -0
- package/dist/transport/adapters/desktop-uia.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-uia.js +66 -0
- package/dist/transport/adapters/desktop-uia.js.map +1 -0
- package/dist/transport/adapters/http.d.ts +40 -0
- package/dist/transport/adapters/http.d.ts.map +1 -0
- package/dist/transport/adapters/http.js +353 -0
- package/dist/transport/adapters/http.js.map +1 -0
- package/dist/transport/adapters/subprocess.d.ts +27 -0
- package/dist/transport/adapters/subprocess.d.ts.map +1 -0
- package/dist/transport/adapters/subprocess.js +254 -0
- package/dist/transport/adapters/subprocess.js.map +1 -0
- package/dist/transport/bus.d.ts +28 -0
- package/dist/transport/bus.d.ts.map +1 -0
- package/dist/transport/bus.js +112 -0
- package/dist/transport/bus.js.map +1 -0
- package/dist/transport/capability.d.ts +38 -0
- package/dist/transport/capability.d.ts.map +1 -0
- package/dist/transport/capability.js +254 -0
- package/dist/transport/capability.js.map +1 -0
- package/dist/transport/types.d.ts +148 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +19 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +32 -10
- package/src/adapters/1688/_site.json +9 -0
- package/src/adapters/1688/item.yaml +7 -0
- package/src/adapters/1688/search.yaml +7 -0
- package/src/adapters/1688/store.yaml +7 -0
- package/src/adapters/36kr/article.yaml +7 -0
- package/src/adapters/36kr/hot.yaml +7 -0
- package/src/adapters/36kr/latest.yaml +7 -0
- package/src/adapters/36kr/news.yaml +7 -0
- package/src/adapters/36kr/search.yaml +7 -0
- package/src/adapters/adguardhome/add-rule.yaml +7 -0
- package/src/adapters/adguardhome/rules.yaml +7 -0
- package/src/adapters/adguardhome/stats.yaml +7 -0
- package/src/adapters/adguardhome/status.yaml +7 -0
- package/src/adapters/adguardhome/toggle.yaml +7 -0
- package/src/adapters/amazon/bestsellers.yaml +7 -0
- package/src/adapters/amazon/discussion.yaml +7 -0
- package/src/adapters/amazon/movers-shakers.yaml +7 -0
- package/src/adapters/amazon/new-releases.yaml +7 -0
- package/src/adapters/amazon/offer.yaml +7 -0
- package/src/adapters/amazon/product.yaml +7 -0
- package/src/adapters/amazon/rankings.yaml +7 -0
- package/src/adapters/amazon/search.yaml +7 -0
- package/src/adapters/apple-music/rate-album.yaml +71 -0
- package/src/adapters/apple-notes/list.yaml +52 -0
- package/src/adapters/apple-notes/read.yaml +44 -0
- package/src/adapters/apple-notes/search.yaml +43 -0
- package/src/adapters/apple-podcasts/episodes.yaml +7 -0
- package/src/adapters/apple-podcasts/search.yaml +7 -0
- package/src/adapters/apple-podcasts/top.yaml +7 -0
- package/src/adapters/arxiv/paper.yaml +7 -0
- package/src/adapters/arxiv/search.yaml +7 -0
- package/src/adapters/arxiv/trending.yaml +7 -0
- package/src/adapters/audacity/convert.yaml +7 -0
- package/src/adapters/audacity/effects.yaml +7 -0
- package/src/adapters/audacity/info.yaml +7 -0
- package/src/adapters/audacity/mix.yaml +7 -0
- package/src/adapters/audacity/normalize.yaml +7 -0
- package/src/adapters/audacity/spectrogram.yaml +7 -0
- package/src/adapters/audacity/split-channels.yaml +7 -0
- package/src/adapters/audacity/trim.yaml +7 -0
- package/src/adapters/autoagent/eval-run.yaml +7 -0
- package/src/adapters/aws/s3-ls.yaml +7 -0
- package/src/adapters/az/account.yaml +7 -0
- package/src/adapters/baidu/hot.yaml +7 -0
- package/src/adapters/baidu/search.yaml +7 -0
- package/src/adapters/band/bands.yaml +7 -0
- package/src/adapters/band/mentions.yaml +7 -0
- package/src/adapters/band/post.yaml +7 -0
- package/src/adapters/band/posts.yaml +7 -0
- package/src/adapters/barchart/_site.json +10 -0
- package/src/adapters/barchart/flow.yaml +7 -0
- package/src/adapters/barchart/greeks.yaml +7 -0
- package/src/adapters/barchart/options.yaml +7 -0
- package/src/adapters/barchart/quote.yaml +7 -0
- package/src/adapters/bbc/news.yaml +7 -0
- package/src/adapters/bbc/technology.yaml +7 -0
- package/src/adapters/bbc/top.yaml +7 -0
- package/src/adapters/bbc/world.yaml +7 -0
- package/src/adapters/bilibili/coin.yaml +7 -0
- package/src/adapters/bilibili/dynamic.yaml +7 -0
- package/src/adapters/bilibili/favorites.yaml +7 -0
- package/src/adapters/bilibili/feed.yaml +7 -0
- package/src/adapters/bilibili/following.yaml +7 -0
- package/src/adapters/bilibili/history.yaml +7 -0
- package/src/adapters/bilibili/hot.yaml +7 -0
- package/src/adapters/bilibili/later.yaml +7 -0
- package/src/adapters/bilibili/live.yaml +7 -0
- package/src/adapters/bilibili/me.yaml +7 -0
- package/src/adapters/bilibili/ranking.yaml +7 -0
- package/src/adapters/bilibili/trending.yaml +7 -0
- package/src/adapters/binance/hot.yaml +7 -0
- package/src/adapters/binance/kline.yaml +7 -0
- package/src/adapters/binance/ticker.yaml +7 -0
- package/src/adapters/blender/animation.yaml +7 -0
- package/src/adapters/blender/camera.yaml +7 -0
- package/src/adapters/blender/convert.yaml +7 -0
- package/src/adapters/blender/export.yaml +7 -0
- package/src/adapters/blender/import.yaml +7 -0
- package/src/adapters/blender/info.yaml +7 -0
- package/src/adapters/blender/lighting.yaml +7 -0
- package/src/adapters/blender/materials.yaml +7 -0
- package/src/adapters/blender/objects.yaml +7 -0
- package/src/adapters/blender/render.yaml +7 -0
- package/src/adapters/blender/scene.yaml +7 -0
- package/src/adapters/blender/screenshot.yaml +7 -0
- package/src/adapters/blender/script.yaml +7 -0
- package/src/adapters/bloomberg/businessweek.yaml +7 -0
- package/src/adapters/bloomberg/economics.yaml +7 -0
- package/src/adapters/bloomberg/feeds.yaml +7 -0
- package/src/adapters/bloomberg/industries.yaml +7 -0
- package/src/adapters/bloomberg/main.yaml +7 -0
- package/src/adapters/bloomberg/markets.yaml +7 -0
- package/src/adapters/bloomberg/news.yaml +7 -0
- package/src/adapters/bloomberg/opinions.yaml +7 -0
- package/src/adapters/bloomberg/politics.yaml +7 -0
- package/src/adapters/bloomberg/tech.yaml +7 -0
- package/src/adapters/bluesky/feeds.yaml +7 -0
- package/src/adapters/bluesky/followers.yaml +7 -0
- package/src/adapters/bluesky/following.yaml +7 -0
- package/src/adapters/bluesky/likes.yaml +7 -0
- package/src/adapters/bluesky/notifications.yaml +7 -0
- package/src/adapters/bluesky/post.yaml +7 -0
- package/src/adapters/bluesky/profile.yaml +7 -0
- package/src/adapters/bluesky/search.yaml +7 -0
- package/src/adapters/bluesky/starter-packs.yaml +7 -0
- package/src/adapters/bluesky/thread.yaml +7 -0
- package/src/adapters/bluesky/trending.yaml +7 -0
- package/src/adapters/bluesky/user.yaml +7 -0
- package/src/adapters/boss/batchgreet.yaml +7 -0
- package/src/adapters/boss/chatlist.yaml +7 -0
- package/src/adapters/boss/chatmsg.yaml +7 -0
- package/src/adapters/boss/detail.yaml +7 -0
- package/src/adapters/boss/exchange.yaml +7 -0
- package/src/adapters/boss/greet.yaml +7 -0
- package/src/adapters/boss/invite.yaml +7 -0
- package/src/adapters/boss/joblist.yaml +7 -0
- package/src/adapters/boss/mark.yaml +7 -0
- package/src/adapters/boss/recommend.yaml +7 -0
- package/src/adapters/boss/resume.yaml +7 -0
- package/src/adapters/boss/search.yaml +7 -0
- package/src/adapters/boss/send.yaml +7 -0
- package/src/adapters/boss/stats.yaml +7 -0
- package/src/adapters/chaoxing/assignments.yaml +7 -0
- package/src/adapters/chaoxing/exams.yaml +7 -0
- package/src/adapters/chrome/bookmarks.yaml +7 -0
- package/src/adapters/chrome/tabs.yaml +7 -0
- package/src/adapters/claude-code/version.yaml +7 -0
- package/src/adapters/cloudcompare/compare.yaml +7 -0
- package/src/adapters/cloudcompare/convert.yaml +7 -0
- package/src/adapters/cloudcompare/info.yaml +7 -0
- package/src/adapters/cloudcompare/subsample.yaml +7 -0
- package/src/adapters/cnki/search.yaml +7 -0
- package/src/adapters/cnn/technology.yaml +7 -0
- package/src/adapters/cnn/top.yaml +7 -0
- package/src/adapters/cocoapods/info.yaml +7 -0
- package/src/adapters/cocoapods/search.yaml +7 -0
- package/src/adapters/codex-cli/version.yaml +7 -0
- package/src/adapters/coinbase/prices.yaml +7 -0
- package/src/adapters/coinbase/rates.yaml +7 -0
- package/src/adapters/comfyui/generate.yaml +7 -0
- package/src/adapters/comfyui/history.yaml +7 -0
- package/src/adapters/comfyui/nodes.yaml +7 -0
- package/src/adapters/comfyui/status.yaml +7 -0
- package/src/adapters/coupang/add-to-cart.yaml +7 -0
- package/src/adapters/coupang/hot.yaml +7 -0
- package/src/adapters/coupang/search.yaml +7 -0
- package/src/adapters/crates-io/info.yaml +7 -0
- package/src/adapters/crates-io/search.yaml +7 -0
- package/src/adapters/crates-io/versions.yaml +7 -0
- package/src/adapters/ctrip/hot.yaml +7 -0
- package/src/adapters/ctrip/search.yaml +7 -0
- package/src/adapters/cua/bench-list.yaml +7 -0
- package/src/adapters/cua/bench-run.yaml +7 -0
- package/src/adapters/dangdang/hot.yaml +7 -0
- package/src/adapters/dangdang/search.yaml +7 -0
- package/src/adapters/deepseek/chat.yaml +7 -0
- package/src/adapters/deepseek/models.yaml +7 -0
- package/src/adapters/devto/latest.yaml +7 -0
- package/src/adapters/devto/search.yaml +7 -0
- package/src/adapters/devto/tag.yaml +7 -0
- package/src/adapters/devto/top.yaml +7 -0
- package/src/adapters/devto/user.yaml +7 -0
- package/src/adapters/dianping/hot.yaml +7 -0
- package/src/adapters/dianping/search.yaml +7 -0
- package/src/adapters/dictionary/examples.yaml +7 -0
- package/src/adapters/dictionary/search.yaml +7 -0
- package/src/adapters/dictionary/synonyms.yaml +7 -0
- package/src/adapters/dingtalk/version.yaml +7 -0
- package/src/adapters/docker/build.yaml +7 -0
- package/src/adapters/docker/images.yaml +7 -0
- package/src/adapters/docker/logs.yaml +7 -0
- package/src/adapters/docker/networks.yaml +7 -0
- package/src/adapters/docker/ps.yaml +7 -0
- package/src/adapters/docker/run.yaml +7 -0
- package/src/adapters/docker/volumes.yaml +7 -0
- package/src/adapters/docker-hub/info.yaml +7 -0
- package/src/adapters/docker-hub/search.yaml +7 -0
- package/src/adapters/docker-hub/tags.yaml +7 -0
- package/src/adapters/doctl/droplets.yaml +7 -0
- package/src/adapters/douban/book-hot.yaml +7 -0
- package/src/adapters/douban/download.yaml +7 -0
- package/src/adapters/douban/group-hot.yaml +7 -0
- package/src/adapters/douban/marks.yaml +7 -0
- package/src/adapters/douban/movie-hot.yaml +7 -0
- package/src/adapters/douban/new-movies.yaml +7 -0
- package/src/adapters/douban/photos.yaml +7 -0
- package/src/adapters/douban/reviews.yaml +7 -0
- package/src/adapters/douban/search.yaml +7 -0
- package/src/adapters/douban/subject.yaml +7 -0
- package/src/adapters/douban/top250.yaml +7 -0
- package/src/adapters/douban/tv-hot.yaml +7 -0
- package/src/adapters/doubao/ask.yaml +7 -0
- package/src/adapters/doubao/new.yaml +7 -0
- package/src/adapters/doubao/status.yaml +7 -0
- package/src/adapters/doubao-web/ask.yaml +7 -0
- package/src/adapters/doubao-web/detail.yaml +7 -0
- package/src/adapters/doubao-web/history.yaml +7 -0
- package/src/adapters/doubao-web/meeting-summary.yaml +7 -0
- package/src/adapters/doubao-web/meeting-transcript.yaml +7 -0
- package/src/adapters/doubao-web/new.yaml +7 -0
- package/src/adapters/doubao-web/read.yaml +7 -0
- package/src/adapters/doubao-web/send.yaml +7 -0
- package/src/adapters/doubao-web/status.yaml +7 -0
- package/src/adapters/douyu/hot.yaml +7 -0
- package/src/adapters/douyu/search.yaml +7 -0
- package/src/adapters/drawio/export.yaml +7 -0
- package/src/adapters/eastmoney/fund.yaml +7 -0
- package/src/adapters/eastmoney/hot.yaml +7 -0
- package/src/adapters/eastmoney/market.yaml +7 -0
- package/src/adapters/eastmoney/search.yaml +7 -0
- package/src/adapters/ele/hot.yaml +8 -0
- package/src/adapters/ele/search.yaml +8 -0
- package/src/adapters/exchangerate/convert.yaml +7 -0
- package/src/adapters/exchangerate/list.yaml +7 -0
- package/src/adapters/facebook/add-friend.yaml +7 -0
- package/src/adapters/facebook/events.yaml +7 -0
- package/src/adapters/facebook/feed.yaml +7 -0
- package/src/adapters/facebook/friends.yaml +7 -0
- package/src/adapters/facebook/groups.yaml +7 -0
- package/src/adapters/facebook/join-group.yaml +7 -0
- package/src/adapters/facebook/marketplace.yaml +7 -0
- package/src/adapters/facebook/memories.yaml +7 -0
- package/src/adapters/facebook/notifications.yaml +7 -0
- package/src/adapters/facebook/post.yaml +7 -0
- package/src/adapters/facebook/profile.yaml +7 -0
- package/src/adapters/facebook/search.yaml +7 -0
- package/src/adapters/feishu/calendar.yaml +7 -0
- package/src/adapters/feishu/docs.yaml +7 -0
- package/src/adapters/feishu/send.yaml +7 -0
- package/src/adapters/feishu/tasks.yaml +7 -0
- package/src/adapters/ffmpeg/compress.yaml +7 -0
- package/src/adapters/ffmpeg/concat.yaml +7 -0
- package/src/adapters/ffmpeg/convert.yaml +7 -0
- package/src/adapters/ffmpeg/extract-audio.yaml +7 -0
- package/src/adapters/ffmpeg/gif.yaml +7 -0
- package/src/adapters/ffmpeg/normalize.yaml +7 -0
- package/src/adapters/ffmpeg/probe.yaml +7 -0
- package/src/adapters/ffmpeg/resize.yaml +7 -0
- package/src/adapters/ffmpeg/subtitles.yaml +7 -0
- package/src/adapters/ffmpeg/thumbnail.yaml +7 -0
- package/src/adapters/ffmpeg/trim.yaml +7 -0
- package/src/adapters/figma/export-selected.yaml +67 -0
- package/src/adapters/flyctl/apps.yaml +7 -0
- package/src/adapters/freecad/assembly.yaml +7 -0
- package/src/adapters/freecad/bom.yaml +7 -0
- package/src/adapters/freecad/boolean.yaml +7 -0
- package/src/adapters/freecad/check.yaml +7 -0
- package/src/adapters/freecad/convert.yaml +7 -0
- package/src/adapters/freecad/export-stl.yaml +7 -0
- package/src/adapters/freecad/import.yaml +7 -0
- package/src/adapters/freecad/info.yaml +7 -0
- package/src/adapters/freecad/macro.yaml +7 -0
- package/src/adapters/freecad/measure.yaml +7 -0
- package/src/adapters/freecad/mesh.yaml +7 -0
- package/src/adapters/freecad/properties.yaml +7 -0
- package/src/adapters/freecad/render.yaml +7 -0
- package/src/adapters/freecad/section.yaml +7 -0
- package/src/adapters/freecad/sketch.yaml +7 -0
- package/src/adapters/futu/hot.yaml +7 -0
- package/src/adapters/futu/quote.yaml +7 -0
- package/src/adapters/gcloud/projects.yaml +7 -0
- package/src/adapters/gemini/ask.yaml +7 -0
- package/src/adapters/gemini/deep-research-result.yaml +7 -0
- package/src/adapters/gemini/deep-research.yaml +7 -0
- package/src/adapters/gemini/image.yaml +7 -0
- package/src/adapters/gemini/new.yaml +7 -0
- package/src/adapters/gh/issue.yaml +7 -0
- package/src/adapters/gh/pr.yaml +7 -0
- package/src/adapters/gh/release.yaml +7 -0
- package/src/adapters/gh/repo.yaml +7 -0
- package/src/adapters/gh/run.yaml +7 -0
- package/src/adapters/gimp/adjust.yaml +7 -0
- package/src/adapters/gimp/batch.yaml +7 -0
- package/src/adapters/gimp/convert.yaml +7 -0
- package/src/adapters/gimp/crop.yaml +7 -0
- package/src/adapters/gimp/filter.yaml +7 -0
- package/src/adapters/gimp/flip.yaml +7 -0
- package/src/adapters/gimp/info.yaml +7 -0
- package/src/adapters/gimp/layers.yaml +7 -0
- package/src/adapters/gimp/merge-layers.yaml +7 -0
- package/src/adapters/gimp/resize.yaml +7 -0
- package/src/adapters/gimp/rotate.yaml +7 -0
- package/src/adapters/gimp/text.yaml +7 -0
- package/src/adapters/gitee/repos.yaml +7 -0
- package/src/adapters/gitee/search.yaml +7 -0
- package/src/adapters/gitee/trending.yaml +7 -0
- package/src/adapters/github-trending/daily.yaml +7 -0
- package/src/adapters/github-trending/developers.yaml +7 -0
- package/src/adapters/github-trending/weekly.yaml +7 -0
- package/src/adapters/gitlab/projects.yaml +7 -0
- package/src/adapters/gitlab/search.yaml +7 -0
- package/src/adapters/gitlab/trending.yaml +7 -0
- package/src/adapters/godot/project-run.yaml +7 -0
- package/src/adapters/godot/scene-export.yaml +7 -0
- package/src/adapters/google/news.yaml +7 -0
- package/src/adapters/google/search.yaml +7 -0
- package/src/adapters/google/suggest.yaml +7 -0
- package/src/adapters/google/trends.yaml +7 -0
- package/src/adapters/grok/ask.yaml +7 -0
- package/src/adapters/hackernews/ask.yaml +7 -0
- package/src/adapters/hackernews/best.yaml +7 -0
- package/src/adapters/hackernews/comments.yaml +7 -0
- package/src/adapters/hackernews/item.yaml +7 -0
- package/src/adapters/hackernews/jobs.yaml +7 -0
- package/src/adapters/hackernews/new.yaml +7 -0
- package/src/adapters/hackernews/search.yaml +7 -0
- package/src/adapters/hackernews/show.yaml +7 -0
- package/src/adapters/hackernews/top.yaml +7 -0
- package/src/adapters/hackernews/user.yaml +7 -0
- package/src/adapters/hermes/sessions-search.yaml +7 -0
- package/src/adapters/hermes/skills-list.yaml +7 -0
- package/src/adapters/hermes/skills-read.yaml +7 -0
- package/src/adapters/hf/datasets.yaml +7 -0
- package/src/adapters/hf/models.yaml +7 -0
- package/src/adapters/hf/spaces.yaml +7 -0
- package/src/adapters/hf/top.yaml +7 -0
- package/src/adapters/homebrew/info.yaml +7 -0
- package/src/adapters/homebrew/search.yaml +7 -0
- package/src/adapters/huggingface-papers/daily.yaml +7 -0
- package/src/adapters/huggingface-papers/search.yaml +7 -0
- package/src/adapters/hupu/detail.yaml +7 -0
- package/src/adapters/hupu/hot.yaml +7 -0
- package/src/adapters/hupu/like.yaml +7 -0
- package/src/adapters/hupu/mentions.yaml +7 -0
- package/src/adapters/hupu/reply.yaml +7 -0
- package/src/adapters/hupu/search.yaml +7 -0
- package/src/adapters/hupu/unlike.yaml +7 -0
- package/src/adapters/imagemagick/compare.yaml +7 -0
- package/src/adapters/imagemagick/composite.yaml +7 -0
- package/src/adapters/imagemagick/convert.yaml +7 -0
- package/src/adapters/imagemagick/identify.yaml +7 -0
- package/src/adapters/imagemagick/montage.yaml +7 -0
- package/src/adapters/imagemagick/resize.yaml +7 -0
- package/src/adapters/imdb/box-office.yaml +7 -0
- package/src/adapters/imdb/person.yaml +7 -0
- package/src/adapters/imdb/reviews.yaml +7 -0
- package/src/adapters/imdb/search.yaml +7 -0
- package/src/adapters/imdb/title.yaml +7 -0
- package/src/adapters/imdb/top.yaml +7 -0
- package/src/adapters/imdb/trending.yaml +7 -0
- package/src/adapters/imessage/contact.yaml +73 -0
- package/src/adapters/imessage/recent.yaml +66 -0
- package/src/adapters/imessage/search.yaml +75 -0
- package/src/adapters/infoq/articles.yaml +7 -0
- package/src/adapters/infoq/latest.yaml +7 -0
- package/src/adapters/inkscape/convert.yaml +7 -0
- package/src/adapters/inkscape/export.yaml +7 -0
- package/src/adapters/inkscape/optimize.yaml +7 -0
- package/src/adapters/instagram/activity.yaml +7 -0
- package/src/adapters/instagram/comment.yaml +7 -0
- package/src/adapters/instagram/explore.yaml +7 -0
- package/src/adapters/instagram/follow.yaml +7 -0
- package/src/adapters/instagram/followers.yaml +7 -0
- package/src/adapters/instagram/following.yaml +7 -0
- package/src/adapters/instagram/highlights.yaml +7 -0
- package/src/adapters/instagram/like.yaml +7 -0
- package/src/adapters/instagram/profile.yaml +7 -0
- package/src/adapters/instagram/reels-trending.yaml +7 -0
- package/src/adapters/instagram/reels.yaml +7 -0
- package/src/adapters/instagram/save.yaml +7 -0
- package/src/adapters/instagram/saved.yaml +7 -0
- package/src/adapters/instagram/search.yaml +7 -0
- package/src/adapters/instagram/stories.yaml +7 -0
- package/src/adapters/instagram/suggested.yaml +7 -0
- package/src/adapters/instagram/tags.yaml +7 -0
- package/src/adapters/instagram/unfollow.yaml +7 -0
- package/src/adapters/instagram/unlike.yaml +7 -0
- package/src/adapters/instagram/unsave.yaml +7 -0
- package/src/adapters/instagram/user.yaml +7 -0
- package/src/adapters/ip-info/lookup.yaml +7 -0
- package/src/adapters/itch-io/popular.yaml +7 -0
- package/src/adapters/itch-io/search.yaml +7 -0
- package/src/adapters/itch-io/top.yaml +7 -0
- package/src/adapters/ithome/hot.yaml +7 -0
- package/src/adapters/ithome/latest.yaml +7 -0
- package/src/adapters/ithome/news.yaml +7 -0
- package/src/adapters/jd/_site.json +9 -0
- package/src/adapters/jd/hot.yaml +7 -0
- package/src/adapters/jd/item.yaml +7 -0
- package/src/adapters/jd/search.yaml +7 -0
- package/src/adapters/jianyu/search.yaml +7 -0
- package/src/adapters/jike/feed.yaml +7 -0
- package/src/adapters/jike/notifications.yaml +7 -0
- package/src/adapters/jike/post.yaml +7 -0
- package/src/adapters/jike/search.yaml +7 -0
- package/src/adapters/jike/topic.yaml +7 -0
- package/src/adapters/jike/user.yaml +7 -0
- package/src/adapters/jimeng/generate.yaml +7 -0
- package/src/adapters/jimeng/history.yaml +7 -0
- package/src/adapters/jq/format.yaml +7 -0
- package/src/adapters/jq/query.yaml +7 -0
- package/src/adapters/kdenlive/effects.yaml +7 -0
- package/src/adapters/kdenlive/info.yaml +7 -0
- package/src/adapters/kdenlive/render.yaml +7 -0
- package/src/adapters/ke/ershoufang.yaml +7 -0
- package/src/adapters/ke/xiaoqu.yaml +7 -0
- package/src/adapters/krita/batch.yaml +7 -0
- package/src/adapters/krita/convert.yaml +7 -0
- package/src/adapters/krita/export.yaml +7 -0
- package/src/adapters/krita/info.yaml +7 -0
- package/src/adapters/kuaishou/hot.yaml +8 -0
- package/src/adapters/kuaishou/search.yaml +8 -0
- package/src/adapters/lark/version.yaml +7 -0
- package/src/adapters/lesswrong/comments.yaml +7 -0
- package/src/adapters/lesswrong/curated.yaml +7 -0
- package/src/adapters/lesswrong/frontpage.yaml +7 -0
- package/src/adapters/lesswrong/new.yaml +7 -0
- package/src/adapters/lesswrong/read.yaml +7 -0
- package/src/adapters/lesswrong/sequences.yaml +7 -0
- package/src/adapters/lesswrong/shortform.yaml +7 -0
- package/src/adapters/lesswrong/tag.yaml +7 -0
- package/src/adapters/lesswrong/tags.yaml +7 -0
- package/src/adapters/lesswrong/top-month.yaml +7 -0
- package/src/adapters/lesswrong/top-week.yaml +7 -0
- package/src/adapters/lesswrong/top-year.yaml +7 -0
- package/src/adapters/lesswrong/top.yaml +7 -0
- package/src/adapters/lesswrong/user-posts.yaml +7 -0
- package/src/adapters/lesswrong/user.yaml +7 -0
- package/src/adapters/libreoffice/convert.yaml +7 -0
- package/src/adapters/libreoffice/print.yaml +7 -0
- package/src/adapters/linear/issue-create.yaml +98 -0
- package/src/adapters/linear/issue-list.yaml +87 -0
- package/src/adapters/linear/issue-update.yaml +100 -0
- package/src/adapters/linkedin/_site.json +10 -0
- package/src/adapters/linkedin/jobs.yaml +7 -0
- package/src/adapters/linkedin/profile.yaml +7 -0
- package/src/adapters/linkedin/search.yaml +7 -0
- package/src/adapters/linkedin/timeline.yaml +7 -0
- package/src/adapters/linux-do/categories.yaml +7 -0
- package/src/adapters/linux-do/category.yaml +7 -0
- package/src/adapters/linux-do/feed.yaml +7 -0
- package/src/adapters/linux-do/hot.yaml +7 -0
- package/src/adapters/linux-do/latest.yaml +7 -0
- package/src/adapters/linux-do/search.yaml +7 -0
- package/src/adapters/linux-do/tags.yaml +7 -0
- package/src/adapters/linux-do/topic.yaml +7 -0
- package/src/adapters/linux-do/user-posts.yaml +7 -0
- package/src/adapters/linux-do/user-topics.yaml +7 -0
- package/src/adapters/lobsters/active.yaml +7 -0
- package/src/adapters/lobsters/hot.yaml +7 -0
- package/src/adapters/lobsters/newest.yaml +7 -0
- package/src/adapters/lobsters/search.yaml +7 -0
- package/src/adapters/lobsters/tag.yaml +7 -0
- package/src/adapters/macos/active-app.yaml +7 -0
- package/src/adapters/macos/apps-list.yaml +7 -0
- package/src/adapters/macos/apps.yaml +7 -0
- package/src/adapters/macos/battery.yaml +7 -0
- package/src/adapters/macos/bluetooth.yaml +7 -0
- package/src/adapters/macos/brightness.yaml +7 -0
- package/src/adapters/macos/caffeinate.yaml +7 -0
- package/src/adapters/macos/calendar-create.yaml +7 -0
- package/src/adapters/macos/calendar-list.yaml +7 -0
- package/src/adapters/macos/calendar-today.yaml +7 -0
- package/src/adapters/macos/clipboard.yaml +7 -0
- package/src/adapters/macos/contacts-search.yaml +7 -0
- package/src/adapters/macos/dark-mode.yaml +7 -0
- package/src/adapters/macos/disk-info.yaml +7 -0
- package/src/adapters/macos/disk-usage.yaml +7 -0
- package/src/adapters/macos/do-not-disturb.yaml +7 -0
- package/src/adapters/macos/empty-trash.yaml +7 -0
- package/src/adapters/macos/finder-copy.yaml +47 -0
- package/src/adapters/macos/finder-move.yaml +47 -0
- package/src/adapters/macos/finder-new-folder.yaml +43 -0
- package/src/adapters/macos/finder-recent.yaml +7 -0
- package/src/adapters/macos/finder-selection.yaml +7 -0
- package/src/adapters/macos/finder-tags.yaml +7 -0
- package/src/adapters/macos/lock-screen.yaml +7 -0
- package/src/adapters/macos/mail-send.yaml +7 -0
- package/src/adapters/macos/mail-status.yaml +7 -0
- package/src/adapters/macos/messages-send.yaml +7 -0
- package/src/adapters/macos/music-control.yaml +7 -0
- package/src/adapters/macos/music-now.yaml +7 -0
- package/src/adapters/macos/notes-list.yaml +7 -0
- package/src/adapters/macos/notes-search.yaml +7 -0
- package/src/adapters/macos/notification.yaml +7 -0
- package/src/adapters/macos/notify.yaml +7 -0
- package/src/adapters/macos/open-app.yaml +7 -0
- package/src/adapters/macos/open.yaml +7 -0
- package/src/adapters/macos/photos-search.yaml +7 -0
- package/src/adapters/macos/processes.yaml +7 -0
- package/src/adapters/macos/reminder-create.yaml +7 -0
- package/src/adapters/macos/reminders-complete.yaml +7 -0
- package/src/adapters/macos/reminders-list.yaml +7 -0
- package/src/adapters/macos/safari-history.yaml +30 -0
- package/src/adapters/macos/safari-tabs.yaml +7 -0
- package/src/adapters/macos/safari-url.yaml +29 -0
- package/src/adapters/macos/say.yaml +7 -0
- package/src/adapters/macos/screen-lock.yaml +7 -0
- package/src/adapters/macos/screen-recording.yaml +39 -0
- package/src/adapters/macos/screenshot.yaml +7 -0
- package/src/adapters/macos/shortcuts-list.yaml +7 -0
- package/src/adapters/macos/shortcuts-run.yaml +7 -0
- package/src/adapters/macos/sleep.yaml +7 -0
- package/src/adapters/macos/spotlight.yaml +7 -0
- package/src/adapters/macos/system-info.yaml +7 -0
- package/src/adapters/macos/trash.yaml +7 -0
- package/src/adapters/macos/uptime.yaml +7 -0
- package/src/adapters/macos/volume.yaml +7 -0
- package/src/adapters/macos/wallpaper.yaml +40 -0
- package/src/adapters/macos/wifi-info.yaml +7 -0
- package/src/adapters/macos/wifi.yaml +7 -0
- package/src/adapters/maimai/search.yaml +7 -0
- package/src/adapters/maoyan/hot.yaml +7 -0
- package/src/adapters/maoyan/search.yaml +7 -0
- package/src/adapters/mastodon/search.yaml +7 -0
- package/src/adapters/mastodon/timeline.yaml +7 -0
- package/src/adapters/mastodon/trending.yaml +7 -0
- package/src/adapters/mastodon/user.yaml +7 -0
- package/src/adapters/medium/article.yaml +7 -0
- package/src/adapters/medium/feed.yaml +7 -0
- package/src/adapters/medium/search.yaml +7 -0
- package/src/adapters/medium/trending.yaml +7 -0
- package/src/adapters/medium/user.yaml +7 -0
- package/src/adapters/meituan/hot.yaml +7 -0
- package/src/adapters/meituan/search.yaml +7 -0
- package/src/adapters/mermaid/render.yaml +7 -0
- package/src/adapters/minimax/chat.yaml +7 -0
- package/src/adapters/minimax/models.yaml +7 -0
- package/src/adapters/minimax/tts.yaml +7 -0
- package/src/adapters/motion-studio/component-get.yaml +7 -0
- package/src/adapters/mubu/list.yaml +7 -0
- package/src/adapters/mubu/search.yaml +14 -0
- package/src/adapters/musescore/convert.yaml +7 -0
- package/src/adapters/musescore/export.yaml +7 -0
- package/src/adapters/musescore/info.yaml +7 -0
- package/src/adapters/musescore/instruments.yaml +7 -0
- package/src/adapters/musescore/transpose.yaml +7 -0
- package/src/adapters/neonctl/projects.yaml +7 -0
- package/src/adapters/netease-music/hot.yaml +7 -0
- package/src/adapters/netease-music/playlist.yaml +7 -0
- package/src/adapters/netease-music/search.yaml +7 -0
- package/src/adapters/netease-music/top.yaml +7 -0
- package/src/adapters/netlify/sites.yaml +7 -0
- package/src/adapters/notebooklm/current.yaml +7 -0
- package/src/adapters/notebooklm/get.yaml +7 -0
- package/src/adapters/notebooklm/history.yaml +7 -0
- package/src/adapters/notebooklm/list.yaml +7 -0
- package/src/adapters/notebooklm/note-list.yaml +7 -0
- package/src/adapters/notebooklm/notes-get.yaml +7 -0
- package/src/adapters/notebooklm/open.yaml +7 -0
- package/src/adapters/notebooklm/rpc.yaml +7 -0
- package/src/adapters/notebooklm/shared.yaml +7 -0
- package/src/adapters/notebooklm/source-fulltext.yaml +7 -0
- package/src/adapters/notebooklm/source-get.yaml +7 -0
- package/src/adapters/notebooklm/source-guide.yaml +7 -0
- package/src/adapters/notebooklm/source-list.yaml +7 -0
- package/src/adapters/notebooklm/status.yaml +7 -0
- package/src/adapters/notebooklm/summary.yaml +7 -0
- package/src/adapters/notion/databases.yaml +7 -0
- package/src/adapters/notion/pages.yaml +7 -0
- package/src/adapters/notion/search.yaml +7 -0
- package/src/adapters/novita/generate.yaml +7 -0
- package/src/adapters/novita/models.yaml +7 -0
- package/src/adapters/novita/status.yaml +7 -0
- package/src/adapters/npm/downloads.yaml +7 -0
- package/src/adapters/npm/info.yaml +7 -0
- package/src/adapters/npm/search.yaml +7 -0
- package/src/adapters/npm/versions.yaml +7 -0
- package/src/adapters/npm-trends/compare.yaml +7 -0
- package/src/adapters/npm-trends/trending.yaml +7 -0
- package/src/adapters/nytimes/search.yaml +7 -0
- package/src/adapters/nytimes/top.yaml +7 -0
- package/src/adapters/obs/record-start.yaml +7 -0
- package/src/adapters/obs/record-stop.yaml +7 -0
- package/src/adapters/obs/scenes.yaml +7 -0
- package/src/adapters/obs/screenshot.yaml +7 -0
- package/src/adapters/obs/sources.yaml +7 -0
- package/src/adapters/obs/status.yaml +7 -0
- package/src/adapters/obs/stream-start.yaml +7 -0
- package/src/adapters/obs/stream-stop.yaml +7 -0
- package/src/adapters/obsidian/daily.yaml +7 -0
- package/src/adapters/obsidian/open.yaml +7 -0
- package/src/adapters/obsidian/search.yaml +7 -0
- package/src/adapters/ollama/generate.yaml +7 -0
- package/src/adapters/ollama/list.yaml +7 -0
- package/src/adapters/ollama/models.yaml +7 -0
- package/src/adapters/ollama/ps.yaml +7 -0
- package/src/adapters/ones/enrich-tasks.yaml +7 -0
- package/src/adapters/ones/login.yaml +7 -0
- package/src/adapters/ones/logout.yaml +7 -0
- package/src/adapters/ones/me.yaml +7 -0
- package/src/adapters/ones/my-tasks.yaml +7 -0
- package/src/adapters/ones/resolve-labels.yaml +7 -0
- package/src/adapters/ones/task-helpers.yaml +7 -0
- package/src/adapters/ones/task.yaml +7 -0
- package/src/adapters/ones/tasks.yaml +7 -0
- package/src/adapters/ones/token-info.yaml +7 -0
- package/src/adapters/ones/worklog.yaml +7 -0
- package/src/adapters/opencode/version.yaml +7 -0
- package/src/adapters/openharness/memory-read.yaml +7 -0
- package/src/adapters/openharness/skills-list.yaml +7 -0
- package/src/adapters/openrouter/models.yaml +7 -0
- package/src/adapters/openrouter/search.yaml +7 -0
- package/src/adapters/pandoc/convert.yaml +7 -0
- package/src/adapters/paperreview/feedback.yaml +7 -0
- package/src/adapters/paperreview/review.yaml +7 -0
- package/src/adapters/paperreview/submit.yaml +7 -0
- package/src/adapters/perplexity/ask.yaml +7 -0
- package/src/adapters/pexels/curated.yaml +7 -0
- package/src/adapters/pexels/search.yaml +7 -0
- package/src/adapters/pinduoduo/hot.yaml +7 -0
- package/src/adapters/pinduoduo/search.yaml +7 -0
- package/src/adapters/pixiv/detail.yaml +7 -0
- package/src/adapters/pixiv/download.yaml +7 -0
- package/src/adapters/pixiv/illusts.yaml +7 -0
- package/src/adapters/pixiv/ranking.yaml +7 -0
- package/src/adapters/pixiv/search.yaml +7 -0
- package/src/adapters/pixiv/user.yaml +7 -0
- package/src/adapters/producthunt/browse.yaml +7 -0
- package/src/adapters/producthunt/hot.yaml +7 -0
- package/src/adapters/producthunt/posts.yaml +7 -0
- package/src/adapters/producthunt/search.yaml +7 -0
- package/src/adapters/producthunt/today.yaml +7 -0
- package/src/adapters/pscale/databases.yaml +7 -0
- package/src/adapters/pypi/info.yaml +7 -0
- package/src/adapters/pypi/search.yaml +7 -0
- package/src/adapters/pypi/versions.yaml +7 -0
- package/src/adapters/quark/ls.yaml +7 -0
- package/src/adapters/quark/search.yaml +7 -0
- package/src/adapters/qweather/forecast.yaml +7 -0
- package/src/adapters/qweather/now.yaml +7 -0
- package/src/adapters/railway/deploy.yaml +7 -0
- package/src/adapters/reddit/comment.yaml +7 -0
- package/src/adapters/reddit/comments.yaml +7 -0
- package/src/adapters/reddit/frontpage.yaml +7 -0
- package/src/adapters/reddit/hot.yaml +7 -0
- package/src/adapters/reddit/new.yaml +7 -0
- package/src/adapters/reddit/popular.yaml +7 -0
- package/src/adapters/reddit/read.yaml +7 -0
- package/src/adapters/reddit/rising.yaml +7 -0
- package/src/adapters/reddit/save.yaml +7 -0
- package/src/adapters/reddit/saved.yaml +7 -0
- package/src/adapters/reddit/search.yaml +7 -0
- package/src/adapters/reddit/subreddit.yaml +7 -0
- package/src/adapters/reddit/subscribe.yaml +7 -0
- package/src/adapters/reddit/top.yaml +7 -0
- package/src/adapters/reddit/trending.yaml +7 -0
- package/src/adapters/reddit/upvote.yaml +7 -0
- package/src/adapters/reddit/upvoted.yaml +7 -0
- package/src/adapters/reddit/user-comments.yaml +7 -0
- package/src/adapters/reddit/user-posts.yaml +7 -0
- package/src/adapters/reddit/user.yaml +7 -0
- package/src/adapters/renderdoc/capture-list.yaml +7 -0
- package/src/adapters/renderdoc/frame-export.yaml +7 -0
- package/src/adapters/replicate/run.yaml +7 -0
- package/src/adapters/replicate/search.yaml +7 -0
- package/src/adapters/replicate/trending.yaml +7 -0
- package/src/adapters/reuters/_site.json +9 -0
- package/src/adapters/reuters/article.yaml +7 -0
- package/src/adapters/reuters/latest.yaml +7 -0
- package/src/adapters/reuters/search.yaml +7 -0
- package/src/adapters/reuters/top.yaml +7 -0
- package/src/adapters/shotcut/effects.yaml +7 -0
- package/src/adapters/shotcut/info.yaml +7 -0
- package/src/adapters/shotcut/render.yaml +7 -0
- package/src/adapters/sinablog/_site.json +9 -0
- package/src/adapters/sinablog/article.yaml +7 -0
- package/src/adapters/sinablog/hot.yaml +7 -0
- package/src/adapters/sinablog/search.yaml +7 -0
- package/src/adapters/sinablog/user.yaml +7 -0
- package/src/adapters/sinafinance/market.yaml +7 -0
- package/src/adapters/sinafinance/news.yaml +7 -0
- package/src/adapters/sinafinance/rolling-news.yaml +7 -0
- package/src/adapters/sinafinance/stock-rank.yaml +7 -0
- package/src/adapters/sinafinance/stock.yaml +7 -0
- package/src/adapters/sketch/artboards.yaml +7 -0
- package/src/adapters/sketch/export.yaml +7 -0
- package/src/adapters/sketch/symbols.yaml +7 -0
- package/src/adapters/slack/channels.yaml +7 -0
- package/src/adapters/slack/messages.yaml +7 -0
- package/src/adapters/slack/post.yaml +7 -0
- package/src/adapters/slack/search.yaml +7 -0
- package/src/adapters/slack/send.yaml +7 -0
- package/src/adapters/slack/status.yaml +7 -0
- package/src/adapters/slack/users.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/deck.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/end-turn.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/map.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/play-card.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/status.yaml +7 -0
- package/src/adapters/slay-the-spire-ii/use-potion.yaml +7 -0
- package/src/adapters/slock/servers.yaml +7 -0
- package/src/adapters/smzdm/_site.json +9 -0
- package/src/adapters/smzdm/article.yaml +7 -0
- package/src/adapters/smzdm/hot.yaml +7 -0
- package/src/adapters/smzdm/search.yaml +7 -0
- package/src/adapters/spotify/now-playing.yaml +7 -0
- package/src/adapters/spotify/playlists.yaml +7 -0
- package/src/adapters/spotify/search.yaml +7 -0
- package/src/adapters/spotify/top-tracks.yaml +7 -0
- package/src/adapters/sspai/hot.yaml +7 -0
- package/src/adapters/sspai/latest.yaml +7 -0
- package/src/adapters/stackoverflow/bounties.yaml +7 -0
- package/src/adapters/stackoverflow/hot.yaml +7 -0
- package/src/adapters/stackoverflow/question.yaml +7 -0
- package/src/adapters/stackoverflow/search.yaml +7 -0
- package/src/adapters/stackoverflow/tags.yaml +7 -0
- package/src/adapters/stackoverflow/unanswered.yaml +7 -0
- package/src/adapters/stagehand/wrap-observe.yaml +7 -0
- package/src/adapters/steam/app-details.yaml +7 -0
- package/src/adapters/steam/new-releases.yaml +7 -0
- package/src/adapters/steam/search.yaml +7 -0
- package/src/adapters/steam/specials.yaml +7 -0
- package/src/adapters/steam/top-sellers.yaml +7 -0
- package/src/adapters/steam/wishlist.yaml +7 -0
- package/src/adapters/substack/feed.yaml +7 -0
- package/src/adapters/substack/publication.yaml +7 -0
- package/src/adapters/substack/search.yaml +7 -0
- package/src/adapters/substack/trending.yaml +7 -0
- package/src/adapters/supabase/projects.yaml +7 -0
- package/src/adapters/taobao/hot.yaml +7 -0
- package/src/adapters/taobao/search.yaml +7 -0
- package/src/adapters/techcrunch/latest.yaml +7 -0
- package/src/adapters/techcrunch/search.yaml +7 -0
- package/src/adapters/theverge/latest.yaml +7 -0
- package/src/adapters/theverge/search.yaml +7 -0
- package/src/adapters/threads/hot.yaml +8 -0
- package/src/adapters/threads/search.yaml +8 -0
- package/src/adapters/tieba/hot.yaml +7 -0
- package/src/adapters/tieba/posts.yaml +7 -0
- package/src/adapters/tieba/read.yaml +7 -0
- package/src/adapters/tieba/search.yaml +7 -0
- package/src/adapters/tiktok/comment.yaml +7 -0
- package/src/adapters/tiktok/explore.yaml +7 -0
- package/src/adapters/tiktok/follow.yaml +7 -0
- package/src/adapters/tiktok/following.yaml +7 -0
- package/src/adapters/tiktok/friends.yaml +7 -0
- package/src/adapters/tiktok/like.yaml +7 -0
- package/src/adapters/tiktok/live.yaml +7 -0
- package/src/adapters/tiktok/notifications.yaml +7 -0
- package/src/adapters/tiktok/profile.yaml +7 -0
- package/src/adapters/tiktok/save.yaml +7 -0
- package/src/adapters/tiktok/search.yaml +7 -0
- package/src/adapters/tiktok/trending.yaml +7 -0
- package/src/adapters/tiktok/unfollow.yaml +7 -0
- package/src/adapters/tiktok/unlike.yaml +7 -0
- package/src/adapters/tiktok/unsave.yaml +7 -0
- package/src/adapters/tiktok/user.yaml +7 -0
- package/src/adapters/toutiao/hot.yaml +7 -0
- package/src/adapters/toutiao/search.yaml +8 -0
- package/src/adapters/twitch/games.yaml +7 -0
- package/src/adapters/twitch/search.yaml +7 -0
- package/src/adapters/twitch/streams.yaml +7 -0
- package/src/adapters/twitch/top.yaml +7 -0
- package/src/adapters/twitter/lists.yaml +7 -0
- package/src/adapters/twitter/media.yaml +7 -0
- package/src/adapters/twitter/mentions.yaml +7 -0
- package/src/adapters/twitter/mute.yaml +7 -0
- package/src/adapters/twitter/pin.yaml +7 -0
- package/src/adapters/twitter/quotes.yaml +7 -0
- package/src/adapters/twitter/retweets.yaml +7 -0
- package/src/adapters/twitter/spaces.yaml +7 -0
- package/src/adapters/twitter/unmute.yaml +7 -0
- package/src/adapters/unsplash/random.yaml +7 -0
- package/src/adapters/unsplash/search.yaml +7 -0
- package/src/adapters/v2ex/daily.yaml +7 -0
- package/src/adapters/v2ex/hot.yaml +7 -0
- package/src/adapters/v2ex/latest.yaml +7 -0
- package/src/adapters/v2ex/me.yaml +7 -0
- package/src/adapters/v2ex/member.yaml +7 -0
- package/src/adapters/v2ex/node.yaml +7 -0
- package/src/adapters/v2ex/nodes.yaml +7 -0
- package/src/adapters/v2ex/notifications.yaml +7 -0
- package/src/adapters/v2ex/replies.yaml +7 -0
- package/src/adapters/v2ex/search.yaml +7 -0
- package/src/adapters/v2ex/topic.yaml +7 -0
- package/src/adapters/v2ex/user.yaml +7 -0
- package/src/adapters/vercel/list.yaml +7 -0
- package/src/adapters/vscode/extensions.yaml +7 -0
- package/src/adapters/vscode/install-ext.yaml +7 -0
- package/src/adapters/vscode/open.yaml +7 -0
- package/src/adapters/web/read.yaml +7 -0
- package/src/adapters/wechat-channels/hot.yaml +8 -0
- package/src/adapters/wechat-channels/search.yaml +15 -0
- package/src/adapters/weibo/comments.yaml +7 -0
- package/src/adapters/weibo/feed.yaml +7 -0
- package/src/adapters/weibo/hot.yaml +7 -0
- package/src/adapters/weibo/me.yaml +7 -0
- package/src/adapters/weibo/post.yaml +7 -0
- package/src/adapters/weibo/profile.yaml +7 -0
- package/src/adapters/weibo/search.yaml +7 -0
- package/src/adapters/weibo/timeline.yaml +7 -0
- package/src/adapters/weibo/trending.yaml +7 -0
- package/src/adapters/weibo/user.yaml +7 -0
- package/src/adapters/weixin/_site.json +9 -0
- package/src/adapters/weixin/article.yaml +7 -0
- package/src/adapters/weixin/download.yaml +7 -0
- package/src/adapters/weixin/hot.yaml +7 -0
- package/src/adapters/weixin/search.yaml +7 -0
- package/src/adapters/weread/book.yaml +7 -0
- package/src/adapters/weread/highlights.yaml +7 -0
- package/src/adapters/weread/notebooks.yaml +7 -0
- package/src/adapters/weread/notes.yaml +7 -0
- package/src/adapters/weread/ranking.yaml +7 -0
- package/src/adapters/weread/search.yaml +7 -0
- package/src/adapters/weread/shelf.yaml +7 -0
- package/src/adapters/wikipedia/random.yaml +7 -0
- package/src/adapters/wikipedia/search.yaml +7 -0
- package/src/adapters/wikipedia/summary.yaml +7 -0
- package/src/adapters/wikipedia/today.yaml +7 -0
- package/src/adapters/wikipedia/trending.yaml +7 -0
- package/src/adapters/wiremock/create-stub.yaml +7 -0
- package/src/adapters/wiremock/delete-stub.yaml +7 -0
- package/src/adapters/wiremock/reset.yaml +7 -0
- package/src/adapters/wiremock/stubs.yaml +7 -0
- package/src/adapters/wiremock/verify.yaml +7 -0
- package/src/adapters/wrangler/list.yaml +7 -0
- package/src/adapters/xianyu/chat.yaml +7 -0
- package/src/adapters/xianyu/item.yaml +7 -0
- package/src/adapters/xianyu/search.yaml +8 -0
- package/src/adapters/xiaoe/catalog.yaml +7 -0
- package/src/adapters/xiaoe/content.yaml +7 -0
- package/src/adapters/xiaoe/courses.yaml +7 -0
- package/src/adapters/xiaoe/detail.yaml +7 -0
- package/src/adapters/xiaoe/play-url.yaml +7 -0
- package/src/adapters/xiaohongshu/feed.yaml +7 -0
- package/src/adapters/xiaohongshu/follow.yaml +7 -0
- package/src/adapters/xiaohongshu/hashtag.yaml +7 -0
- package/src/adapters/xiaohongshu/hot.yaml +7 -0
- package/src/adapters/xiaohongshu/like.yaml +7 -0
- package/src/adapters/xiaohongshu/notifications.yaml +7 -0
- package/src/adapters/xiaohongshu/profile.yaml +7 -0
- package/src/adapters/xiaohongshu/save.yaml +7 -0
- package/src/adapters/xiaohongshu/suggest.yaml +7 -0
- package/src/adapters/xiaohongshu/trending.yaml +7 -0
- package/src/adapters/xiaohongshu/unfollow.yaml +7 -0
- package/src/adapters/xiaoyuzhou/episode.yaml +7 -0
- package/src/adapters/xiaoyuzhou/podcast-episodes.yaml +7 -0
- package/src/adapters/xiaoyuzhou/podcast.yaml +7 -0
- package/src/adapters/xueqiu/comments.yaml +7 -0
- package/src/adapters/xueqiu/earnings-date.yaml +7 -0
- package/src/adapters/xueqiu/feed.yaml +7 -0
- package/src/adapters/xueqiu/fund-holdings.yaml +7 -0
- package/src/adapters/xueqiu/fund-snapshot.yaml +7 -0
- package/src/adapters/xueqiu/hot-stock.yaml +7 -0
- package/src/adapters/xueqiu/hot.yaml +7 -0
- package/src/adapters/xueqiu/market.yaml +7 -0
- package/src/adapters/xueqiu/quote.yaml +7 -0
- package/src/adapters/xueqiu/search.yaml +7 -0
- package/src/adapters/xueqiu/stock.yaml +7 -0
- package/src/adapters/xueqiu/watchlist.yaml +7 -0
- package/src/adapters/yahoo-finance/quote.yaml +7 -0
- package/src/adapters/yahoo-finance/search.yaml +7 -0
- package/src/adapters/yahoo-finance/trending.yaml +7 -0
- package/src/adapters/ycombinator/launches.yaml +7 -0
- package/src/adapters/yollomi/background.yaml +7 -0
- package/src/adapters/yollomi/edit.yaml +7 -0
- package/src/adapters/yollomi/face-swap.yaml +7 -0
- package/src/adapters/yollomi/generate.yaml +7 -0
- package/src/adapters/yollomi/models.yaml +7 -0
- package/src/adapters/yollomi/object-remover.yaml +7 -0
- package/src/adapters/yollomi/remove-bg.yaml +7 -0
- package/src/adapters/yollomi/restore.yaml +7 -0
- package/src/adapters/yollomi/try-on.yaml +7 -0
- package/src/adapters/yollomi/upload.yaml +7 -0
- package/src/adapters/yollomi/upscale.yaml +7 -0
- package/src/adapters/yollomi/video.yaml +7 -0
- package/src/adapters/youtube/playlist.yaml +7 -0
- package/src/adapters/youtube/shorts.yaml +7 -0
- package/src/adapters/youtube/trending.yaml +7 -0
- package/src/adapters/yt-dlp/download.yaml +7 -0
- package/src/adapters/yt-dlp/extract-audio.yaml +7 -0
- package/src/adapters/yt-dlp/info.yaml +7 -0
- package/src/adapters/yt-dlp/search.yaml +7 -0
- package/src/adapters/yuanbao/ask.yaml +7 -0
- package/src/adapters/yuanbao/new.yaml +7 -0
- package/src/adapters/yuanbao/shared.yaml +7 -0
- package/src/adapters/zhihu/answer.yaml +7 -0
- package/src/adapters/zhihu/answers.yaml +7 -0
- package/src/adapters/zhihu/article.yaml +7 -0
- package/src/adapters/zhihu/articles.yaml +7 -0
- package/src/adapters/zhihu/collections.yaml +7 -0
- package/src/adapters/zhihu/columns.yaml +7 -0
- package/src/adapters/zhihu/comment.yaml +7 -0
- package/src/adapters/zhihu/download.yaml +7 -0
- package/src/adapters/zhihu/feed.yaml +7 -0
- package/src/adapters/zhihu/followers.yaml +7 -0
- package/src/adapters/zhihu/following.yaml +7 -0
- package/src/adapters/zhihu/hot.yaml +7 -0
- package/src/adapters/zhihu/me.yaml +7 -0
- package/src/adapters/zhihu/notifications.yaml +7 -0
- package/src/adapters/zhihu/pins.yaml +7 -0
- package/src/adapters/zhihu/question.yaml +7 -0
- package/src/adapters/zhihu/search.yaml +7 -0
- package/src/adapters/zhihu/topic.yaml +7 -0
- package/src/adapters/zhihu/topics.yaml +7 -0
- package/src/adapters/zhihu/trending.yaml +7 -0
- package/src/adapters/zhihu/user.yaml +7 -0
- package/src/adapters/zoom/join.yaml +7 -0
- package/src/adapters/zoom/start.yaml +7 -0
- package/src/adapters/zoom/toggle-mute.yaml +37 -0
- package/src/adapters/zotero/add-note.yaml +7 -0
- package/src/adapters/zotero/add-tag.yaml +7 -0
- package/src/adapters/zotero/collections.yaml +7 -0
- package/src/adapters/zotero/export.yaml +7 -0
- package/src/adapters/zotero/items.yaml +7 -0
- package/src/adapters/zotero/notes.yaml +7 -0
- package/src/adapters/zotero/search.yaml +7 -0
- package/src/adapters/zotero/tags.yaml +7 -0
- package/src/adapters/zsxq/dynamics.yaml +7 -0
- package/src/adapters/zsxq/groups.yaml +7 -0
- package/src/adapters/zsxq/search.yaml +7 -0
- package/src/adapters/zsxq/topic.yaml +7 -0
- package/src/adapters/zsxq/topics.yaml +7 -0
- package/src/adapters/1688/manifest.yaml +0 -7
- package/src/adapters/barchart/manifest.yaml +0 -8
- package/src/adapters/jd/manifest.yaml +0 -7
- package/src/adapters/linkedin/manifest.yaml +0 -8
- package/src/adapters/reuters/manifest.yaml +0 -7
- package/src/adapters/sinablog/manifest.yaml +0 -7
- package/src/adapters/smzdm/manifest.yaml +0 -7
- package/src/adapters/weixin/manifest.yaml +0 -7
package/dist/mcp/server.js
CHANGED
|
@@ -3,20 +3,19 @@
|
|
|
3
3
|
* MCP (Model Context Protocol) server for Uni-CLI.
|
|
4
4
|
*
|
|
5
5
|
* Two registration modes:
|
|
6
|
-
* 1. **
|
|
6
|
+
* 1. **Smart default** — 3 tools: `unicli_run`, `unicli_list`,
|
|
7
|
+
* `unicli_discover`. Keeps the MCP handshake under 200 tokens.
|
|
8
|
+
* 2. **Expanded (`--expanded`)** — one tool per adapter command
|
|
7
9
|
* (`unicli_<site>_<command>`) with JSON Schema derived from `args` +
|
|
8
|
-
* `columns`.
|
|
9
|
-
* MCP clients see the full Uni-CLI surface area without an extra
|
|
10
|
-
* list_adapters → run_command roundtrip.
|
|
11
|
-
* 2. **Lazy (`--lazy`)** — only `list_adapters` + `run_command` are
|
|
12
|
-
* registered. Useful when an MCP client has a hard tool-count limit
|
|
13
|
-
* or wants the smallest possible handshake.
|
|
10
|
+
* `columns`. MCP clients see the full Uni-CLI surface area.
|
|
14
11
|
*
|
|
15
|
-
*
|
|
12
|
+
* Three transports:
|
|
16
13
|
* - **stdio (default)** — newline-delimited JSON over stdin/stdout
|
|
17
14
|
* - **http (`--transport http [--port 19826]`)** — POST /mcp accepts a
|
|
18
|
-
* single JSON-RPC envelope and returns a single JSON response.
|
|
19
|
-
*
|
|
15
|
+
* single JSON-RPC envelope and returns a single JSON response.
|
|
16
|
+
* - **sse (`--transport sse [--port 19826]`)** — Streamable HTTP with
|
|
17
|
+
* Server-Sent Events. GET /mcp/sse opens the event stream, POST
|
|
18
|
+
* /mcp/message?sessionId=xxx delivers JSON-RPC requests.
|
|
20
19
|
*
|
|
21
20
|
* Auth pass-through is automatic: every adapter the CLI loads (including
|
|
22
21
|
* cookie-based ones) is exposed by name; the runtime resolves cookies on
|
|
@@ -27,175 +26,145 @@ import { createServer, } from "node:http";
|
|
|
27
26
|
import { loadAllAdapters, loadTsAdapters } from "../discovery/loader.js";
|
|
28
27
|
import { getAllAdapters, listCommands, resolveCommand } from "../registry.js";
|
|
29
28
|
import { runPipeline } from "../engine/yaml-runner.js";
|
|
30
|
-
import { VERSION } from "../constants.js";
|
|
31
|
-
//
|
|
32
|
-
|
|
29
|
+
import { VERSION, MCP_PROTOCOL_VERSION } from "../constants.js";
|
|
30
|
+
// sse-transport.ts is deprecated (spec 2025-03-26). Kept for backwards compatibility.
|
|
31
|
+
// import { startSseServer } from "./sse-transport.js";
|
|
32
|
+
import { startStreamableHttp } from "./streamable-http.js";
|
|
33
|
+
import { handleOAuthRoute, createOAuthMiddleware } from "./oauth.js";
|
|
34
|
+
import { buildInputSchema, buildOutputSchema, buildToolName, truncateDescription, } from "./schema.js";
|
|
35
|
+
import { resolveElicitation } from "./elicitation.js";
|
|
36
|
+
// ── Smart default tools (4 meta-tools — the default mode) ─────────────────
|
|
37
|
+
const MAX_RESULT_SIZE_CHARS = 10_000;
|
|
38
|
+
function buildDefaultTools() {
|
|
33
39
|
return [
|
|
34
40
|
{
|
|
35
|
-
name: "
|
|
36
|
-
description: "
|
|
37
|
-
"Use this to discover what sites and commands are available before calling run_command.",
|
|
41
|
+
name: "unicli_run",
|
|
42
|
+
description: "Execute any Uni-CLI command. Returns JSON results.",
|
|
38
43
|
inputSchema: {
|
|
39
44
|
type: "object",
|
|
40
45
|
properties: {
|
|
41
46
|
site: {
|
|
42
47
|
type: "string",
|
|
43
|
-
description: "
|
|
48
|
+
description: "Site name (e.g. hackernews, github, bilibili)",
|
|
44
49
|
},
|
|
45
|
-
|
|
50
|
+
command: {
|
|
46
51
|
type: "string",
|
|
47
|
-
description: "
|
|
48
|
-
|
|
52
|
+
description: "Command to run (e.g. top, search, hot)",
|
|
53
|
+
},
|
|
54
|
+
args: {
|
|
55
|
+
type: "object",
|
|
56
|
+
description: 'Key-value arguments (e.g. {"query": "ai", "limit": 10})',
|
|
57
|
+
additionalProperties: true,
|
|
49
58
|
},
|
|
50
59
|
},
|
|
60
|
+
required: ["site", "command"],
|
|
61
|
+
},
|
|
62
|
+
_meta: {
|
|
63
|
+
"anthropic/searchHint": "Execute CLI commands on 200+ websites and desktop apps. Run adapters by site and command name.",
|
|
64
|
+
},
|
|
65
|
+
annotations: {
|
|
66
|
+
readOnlyHint: false,
|
|
67
|
+
destructiveHint: false,
|
|
68
|
+
idempotentHint: false,
|
|
69
|
+
openWorldHint: true,
|
|
51
70
|
},
|
|
52
71
|
},
|
|
53
72
|
{
|
|
54
|
-
name: "
|
|
55
|
-
description: "
|
|
56
|
-
"Returns JSON results. Use list_adapters first to discover available commands.",
|
|
73
|
+
name: "unicli_list",
|
|
74
|
+
description: "List available commands. Filter by site or adapter type.",
|
|
57
75
|
inputSchema: {
|
|
58
76
|
type: "object",
|
|
59
77
|
properties: {
|
|
60
78
|
site: {
|
|
61
79
|
type: "string",
|
|
62
|
-
description: "
|
|
80
|
+
description: "Filter by site name (partial match)",
|
|
63
81
|
},
|
|
64
|
-
|
|
82
|
+
type: {
|
|
65
83
|
type: "string",
|
|
66
|
-
description: "
|
|
67
|
-
|
|
68
|
-
args: {
|
|
69
|
-
type: "object",
|
|
70
|
-
description: 'Command arguments as key-value pairs (e.g. {"query": "ai", "limit": 10})',
|
|
71
|
-
additionalProperties: true,
|
|
84
|
+
description: "Filter by adapter type",
|
|
85
|
+
enum: ["web-api", "desktop", "browser", "bridge", "service"],
|
|
72
86
|
},
|
|
73
87
|
},
|
|
74
|
-
|
|
88
|
+
},
|
|
89
|
+
_meta: {
|
|
90
|
+
"anthropic/searchHint": "Browse available Uni-CLI sites and commands. Filter by site name or adapter type.",
|
|
91
|
+
"anthropic/alwaysLoad": true,
|
|
92
|
+
},
|
|
93
|
+
annotations: {
|
|
94
|
+
readOnlyHint: true,
|
|
95
|
+
idempotentHint: true,
|
|
96
|
+
openWorldHint: false,
|
|
75
97
|
},
|
|
76
98
|
},
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
description: "Cap result count (default 20)",
|
|
105
|
-
default: 20,
|
|
99
|
+
{
|
|
100
|
+
name: "unicli_search",
|
|
101
|
+
description: "Search 200+ sites and 956 commands by intent. Bilingual (EN/ZH). Returns top matches with usage examples.",
|
|
102
|
+
inputSchema: {
|
|
103
|
+
type: "object",
|
|
104
|
+
properties: {
|
|
105
|
+
query: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: "Natural language intent (e.g. 'download video', '推特热门', 'stock price')",
|
|
108
|
+
},
|
|
109
|
+
limit: {
|
|
110
|
+
type: "integer",
|
|
111
|
+
description: "Max results (default 5)",
|
|
112
|
+
default: 5,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
required: ["query"],
|
|
116
|
+
},
|
|
117
|
+
_meta: {
|
|
118
|
+
"anthropic/searchHint": "Find CLI commands by intent. Semantic search across websites, desktop apps, macOS. Bilingual Chinese/English.",
|
|
119
|
+
"anthropic/alwaysLoad": true,
|
|
120
|
+
},
|
|
121
|
+
annotations: {
|
|
122
|
+
readOnlyHint: true,
|
|
123
|
+
idempotentHint: true,
|
|
124
|
+
openWorldHint: false,
|
|
125
|
+
},
|
|
106
126
|
},
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
if (a.choices)
|
|
119
|
-
prop.enum = a.choices;
|
|
120
|
-
props[a.name] = prop;
|
|
121
|
-
if (a.required)
|
|
122
|
-
required.push(a.name);
|
|
123
|
-
}
|
|
124
|
-
const schema = {
|
|
125
|
-
type: "object",
|
|
126
|
-
properties: props,
|
|
127
|
-
additionalProperties: false,
|
|
128
|
-
};
|
|
129
|
-
if (required.length > 0)
|
|
130
|
-
schema.required = required;
|
|
131
|
-
return schema;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Build the output JSON Schema. We model results as `{ count, results }`
|
|
135
|
-
* mirroring run_command, where each item in `results` follows the
|
|
136
|
-
* `columns` shape (string-typed properties — Uni-CLI columns are
|
|
137
|
-
* format-agnostic and the runtime emits whatever the pipeline produced).
|
|
138
|
-
*/
|
|
139
|
-
/**
|
|
140
|
-
* Build an output JSON Schema. We model results as `{count, results}` where
|
|
141
|
-
* `results` is an array of items. `columns` becomes the item's property set.
|
|
142
|
-
*
|
|
143
|
-
* Note: we return a simple nested schema rather than a full JSON Schema
|
|
144
|
-
* (which would need a deeper `items` type for `array`). Most MCP clients
|
|
145
|
-
* only inspect the top-level type; Anthropic's client is permissive. If a
|
|
146
|
-
* strict validator rejects this, it will still fall back to the lazy tool
|
|
147
|
-
* path via `run_command`.
|
|
148
|
-
*/
|
|
149
|
-
function buildOutputSchema(cmd) {
|
|
150
|
-
const itemProps = {};
|
|
151
|
-
for (const col of cmd.columns ?? []) {
|
|
152
|
-
itemProps[col] = { type: "string", description: `Column: ${col}` };
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
type: "object",
|
|
156
|
-
properties: {
|
|
157
|
-
count: { type: "integer", description: "Number of results returned" },
|
|
158
|
-
results: {
|
|
159
|
-
type: "array",
|
|
160
|
-
description: "Result rows",
|
|
161
|
-
items: {
|
|
162
|
-
type: "object",
|
|
163
|
-
...(Object.keys(itemProps).length > 0
|
|
164
|
-
? { properties: itemProps }
|
|
165
|
-
: {}),
|
|
127
|
+
{
|
|
128
|
+
name: "unicli_explore",
|
|
129
|
+
description: "Auto-discover API endpoints for any URL. Navigates the page, captures network requests, generates YAML adapters.",
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
url: { type: "string", description: "Website URL to explore" },
|
|
134
|
+
goal: {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "Capability to find (e.g. 'search', 'hot', 'feed')",
|
|
137
|
+
},
|
|
166
138
|
},
|
|
139
|
+
required: ["url"],
|
|
140
|
+
},
|
|
141
|
+
_meta: {
|
|
142
|
+
"anthropic/searchHint": "Auto-discover API endpoints for any website URL. Generate YAML adapters for new sites.",
|
|
143
|
+
},
|
|
144
|
+
annotations: {
|
|
145
|
+
readOnlyHint: false,
|
|
146
|
+
destructiveHint: false,
|
|
147
|
+
idempotentHint: false,
|
|
148
|
+
openWorldHint: true,
|
|
167
149
|
},
|
|
168
150
|
},
|
|
169
|
-
|
|
151
|
+
];
|
|
170
152
|
}
|
|
153
|
+
const expandedRegistry = new Map();
|
|
171
154
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
* older clients reject hyphens, so we normalize defensively.
|
|
155
|
+
* Build the expanded tool set: 4 default meta-tools + one full tool per
|
|
156
|
+
* adapter command. Clients see the complete Uni-CLI surface area.
|
|
175
157
|
*
|
|
176
|
-
*
|
|
177
|
-
* and `claude_code-version` would yield the same normalized name). The
|
|
178
|
-
* expanded-mode dispatcher uses a name → {adapter, cmdName} lookup table
|
|
179
|
-
* built at the same time as the tool list, so callers never need to reverse
|
|
180
|
-
* the normalization. See `expandedRegistry` and `buildExpandedTools` below.
|
|
158
|
+
* Token cost: ~160K for 956 commands. Use only when the client can handle it.
|
|
181
159
|
*/
|
|
182
|
-
function buildToolName(site, command) {
|
|
183
|
-
return `unicli_${site}_${command}`.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
184
|
-
}
|
|
185
|
-
const expandedRegistry = new Map();
|
|
186
160
|
function buildExpandedTools() {
|
|
187
161
|
const tools = [];
|
|
188
|
-
|
|
189
|
-
tools.push(buildLazyTools()[0]);
|
|
162
|
+
tools.push(...buildDefaultTools());
|
|
190
163
|
expandedRegistry.clear();
|
|
191
|
-
|
|
192
|
-
// tool name, the first one wins and the second is silently shadowed. We
|
|
193
|
-
// don't expect this in practice (most adapters use lowercase alphanumeric
|
|
194
|
-
// + hyphen names), but flag it on stderr so it gets noticed.
|
|
195
|
-
const seen = new Set();
|
|
164
|
+
const seen = new Set(DEFAULT_TOOL_NAMES);
|
|
196
165
|
for (const adapter of getAllAdapters()) {
|
|
197
166
|
for (const [cmdName, cmd] of Object.entries(adapter.commands)) {
|
|
198
|
-
const
|
|
167
|
+
const rawDesc = cmd.description?.trim() ||
|
|
199
168
|
adapter.description?.trim() ||
|
|
200
169
|
`${cmdName} for ${adapter.name}`;
|
|
201
170
|
const toolName = buildToolName(adapter.name, cmdName);
|
|
@@ -207,30 +176,82 @@ function buildExpandedTools() {
|
|
|
207
176
|
expandedRegistry.set(toolName, { adapter, cmdName, cmd });
|
|
208
177
|
tools.push({
|
|
209
178
|
name: toolName,
|
|
210
|
-
description: `[${adapter.name}] ${
|
|
179
|
+
description: truncateDescription(`[${adapter.name}] ${rawDesc}`),
|
|
211
180
|
inputSchema: buildInputSchema(cmd),
|
|
212
181
|
outputSchema: buildOutputSchema(cmd),
|
|
182
|
+
_meta: {
|
|
183
|
+
"anthropic/searchHint": `${adapter.name}: ${rawDesc}`,
|
|
184
|
+
},
|
|
185
|
+
annotations: {
|
|
186
|
+
readOnlyHint: true,
|
|
187
|
+
idempotentHint: true,
|
|
188
|
+
openWorldHint: true,
|
|
189
|
+
},
|
|
213
190
|
});
|
|
214
191
|
}
|
|
215
192
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
193
|
+
return tools;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Build deferred tool set: 4 default meta-tools with full schemas, plus
|
|
197
|
+
* lightweight stubs for all adapter commands (name + searchHint only,
|
|
198
|
+
* minimal inputSchema). Clients like Claude Code's ToolSearch can discover
|
|
199
|
+
* tools by searchHint and then call them — the handler resolves the full
|
|
200
|
+
* command at call time via the expandedRegistry.
|
|
201
|
+
*
|
|
202
|
+
* Token cost: ~8K (vs ~160K for expanded). 95% reduction.
|
|
203
|
+
*/
|
|
204
|
+
function buildDeferredTools() {
|
|
205
|
+
const tools = [];
|
|
206
|
+
tools.push(...buildDefaultTools());
|
|
207
|
+
expandedRegistry.clear();
|
|
208
|
+
const seen = new Set(DEFAULT_TOOL_NAMES);
|
|
209
|
+
for (const adapter of getAllAdapters()) {
|
|
210
|
+
for (const [cmdName, cmd] of Object.entries(adapter.commands)) {
|
|
211
|
+
const rawDesc = cmd.description?.trim() ||
|
|
212
|
+
adapter.description?.trim() ||
|
|
213
|
+
`${cmdName} for ${adapter.name}`;
|
|
214
|
+
const toolName = buildToolName(adapter.name, cmdName);
|
|
215
|
+
if (seen.has(toolName))
|
|
216
|
+
continue;
|
|
217
|
+
seen.add(toolName);
|
|
218
|
+
// Register in the lookup table for runtime dispatch
|
|
219
|
+
expandedRegistry.set(toolName, { adapter, cmdName, cmd });
|
|
220
|
+
// Lightweight stub: name + searchHint + minimal schema.
|
|
221
|
+
// Full inputSchema is resolved at call time via expandedRegistry.
|
|
222
|
+
tools.push({
|
|
223
|
+
name: toolName,
|
|
224
|
+
description: truncateDescription(`[${adapter.name}] ${rawDesc}`),
|
|
225
|
+
inputSchema: {
|
|
226
|
+
type: "object",
|
|
227
|
+
properties: {
|
|
228
|
+
_args: {
|
|
229
|
+
type: "object",
|
|
230
|
+
description: "Command arguments (pass key-value pairs)",
|
|
231
|
+
additionalProperties: true,
|
|
232
|
+
},
|
|
233
|
+
},
|
|
227
234
|
},
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
235
|
+
_meta: {
|
|
236
|
+
"anthropic/searchHint": `${adapter.name}: ${rawDesc}`,
|
|
237
|
+
},
|
|
238
|
+
annotations: {
|
|
239
|
+
readOnlyHint: true,
|
|
240
|
+
idempotentHint: true,
|
|
241
|
+
openWorldHint: true,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
232
246
|
return tools;
|
|
233
247
|
}
|
|
248
|
+
const DEFAULT_TOOL_NAMES = new Set([
|
|
249
|
+
"unicli_run",
|
|
250
|
+
"unicli_list",
|
|
251
|
+
"unicli_search",
|
|
252
|
+
"unicli_explore",
|
|
253
|
+
"unicli_discover",
|
|
254
|
+
]);
|
|
234
255
|
// ── Tool Handlers ───────────────────────────────────────────────────────────
|
|
235
256
|
function handleListAdapters(params) {
|
|
236
257
|
let commands = listCommands();
|
|
@@ -258,17 +279,14 @@ function handleListAdapters(params) {
|
|
|
258
279
|
type: info.type,
|
|
259
280
|
commands: info.commands,
|
|
260
281
|
}));
|
|
282
|
+
const data = {
|
|
283
|
+
total_sites: result.length,
|
|
284
|
+
total_commands: commands.length,
|
|
285
|
+
adapters: result,
|
|
286
|
+
};
|
|
261
287
|
return {
|
|
262
|
-
content: [
|
|
263
|
-
|
|
264
|
-
type: "text",
|
|
265
|
-
text: JSON.stringify({
|
|
266
|
-
total_sites: result.length,
|
|
267
|
-
total_commands: commands.length,
|
|
268
|
-
adapters: result,
|
|
269
|
-
}, null, 2),
|
|
270
|
-
},
|
|
271
|
-
],
|
|
288
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
289
|
+
structuredContent: { type: "json", data },
|
|
272
290
|
};
|
|
273
291
|
}
|
|
274
292
|
async function runResolvedCommand(adapter, cmd, cmdName, args) {
|
|
@@ -293,56 +311,59 @@ async function runResolvedCommand(adapter, cmd, cmdName, args) {
|
|
|
293
311
|
results = Array.isArray(raw) ? raw : [raw];
|
|
294
312
|
}
|
|
295
313
|
else {
|
|
314
|
+
const errorData = {
|
|
315
|
+
error: "No pipeline or function defined for this command",
|
|
316
|
+
};
|
|
296
317
|
return {
|
|
297
|
-
content: [
|
|
298
|
-
|
|
299
|
-
type: "text",
|
|
300
|
-
text: JSON.stringify({
|
|
301
|
-
error: "No pipeline or function defined for this command",
|
|
302
|
-
}),
|
|
303
|
-
},
|
|
304
|
-
],
|
|
318
|
+
content: [{ type: "text", text: JSON.stringify(errorData) }],
|
|
319
|
+
structuredContent: { type: "json", data: errorData },
|
|
305
320
|
isError: true,
|
|
306
321
|
};
|
|
307
322
|
}
|
|
323
|
+
const data = { count: results.length, results };
|
|
308
324
|
return {
|
|
309
|
-
content: [
|
|
310
|
-
|
|
311
|
-
type: "text",
|
|
312
|
-
text: JSON.stringify({ count: results.length, results }, null, 2),
|
|
313
|
-
},
|
|
314
|
-
],
|
|
325
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
326
|
+
structuredContent: { type: "json", data },
|
|
315
327
|
};
|
|
316
328
|
}
|
|
317
329
|
catch (err) {
|
|
318
330
|
const message = err instanceof Error ? err.message : String(err);
|
|
331
|
+
const errorData = {
|
|
332
|
+
error: message,
|
|
333
|
+
adapter_path: `src/adapters/${adapter.name}/${cmdName}.yaml`,
|
|
334
|
+
suggestion: "The adapter may need updating. Check the YAML file.",
|
|
335
|
+
};
|
|
319
336
|
return {
|
|
320
|
-
content: [
|
|
321
|
-
|
|
322
|
-
type: "text",
|
|
323
|
-
text: JSON.stringify({
|
|
324
|
-
error: message,
|
|
325
|
-
adapter_path: `src/adapters/${adapter.name}/${cmdName}.yaml`,
|
|
326
|
-
suggestion: "The adapter may need updating. Check the YAML file.",
|
|
327
|
-
}, null, 2),
|
|
328
|
-
},
|
|
329
|
-
],
|
|
337
|
+
content: [{ type: "text", text: JSON.stringify(errorData, null, 2) }],
|
|
338
|
+
structuredContent: { type: "json", data: errorData },
|
|
330
339
|
isError: true,
|
|
331
340
|
};
|
|
332
341
|
}
|
|
333
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* Annotate a tool result with `_meta.anthropic/maxResultSizeChars` when the
|
|
345
|
+
* serialized payload exceeds MAX_RESULT_SIZE_CHARS (10 KB). This tells
|
|
346
|
+
* Claude Code to accept large payloads without truncation.
|
|
347
|
+
*/
|
|
348
|
+
export function annotateIfLarge(result) {
|
|
349
|
+
const totalChars = result.content.reduce((sum, c) => sum + c.text.length, 0);
|
|
350
|
+
if (totalChars > MAX_RESULT_SIZE_CHARS) {
|
|
351
|
+
return {
|
|
352
|
+
...result,
|
|
353
|
+
_meta: { "anthropic/maxResultSizeChars": 100_000 },
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
334
358
|
async function handleRunCommand(params) {
|
|
335
359
|
const site = params.site;
|
|
336
360
|
const command = params.command;
|
|
337
361
|
const args = params.args ?? {};
|
|
338
362
|
if (!site || !command) {
|
|
363
|
+
const errorData = { error: "site and command are required" };
|
|
339
364
|
return {
|
|
340
|
-
content: [
|
|
341
|
-
|
|
342
|
-
type: "text",
|
|
343
|
-
text: JSON.stringify({ error: "site and command are required" }),
|
|
344
|
-
},
|
|
345
|
-
],
|
|
365
|
+
content: [{ type: "text", text: JSON.stringify(errorData) }],
|
|
366
|
+
structuredContent: { type: "json", data: errorData },
|
|
346
367
|
isError: true,
|
|
347
368
|
};
|
|
348
369
|
}
|
|
@@ -355,18 +376,15 @@ async function handleRunCommand(params) {
|
|
|
355
376
|
site: a.name,
|
|
356
377
|
commands: Object.keys(a.commands),
|
|
357
378
|
}));
|
|
379
|
+
const errorData = {
|
|
380
|
+
error: `Unknown command: ${site} ${command}`,
|
|
381
|
+
suggestion: matchingSites.length > 0
|
|
382
|
+
? `Did you mean one of these? ${JSON.stringify(matchingSites)}`
|
|
383
|
+
: "Use list_adapters to see all available commands.",
|
|
384
|
+
};
|
|
358
385
|
return {
|
|
359
|
-
content: [
|
|
360
|
-
|
|
361
|
-
type: "text",
|
|
362
|
-
text: JSON.stringify({
|
|
363
|
-
error: `Unknown command: ${site} ${command}`,
|
|
364
|
-
suggestion: matchingSites.length > 0
|
|
365
|
-
? `Did you mean one of these? ${JSON.stringify(matchingSites)}`
|
|
366
|
-
: "Use list_adapters to see all available commands.",
|
|
367
|
-
}, null, 2),
|
|
368
|
-
},
|
|
369
|
-
],
|
|
386
|
+
content: [{ type: "text", text: JSON.stringify(errorData, null, 2) }],
|
|
387
|
+
structuredContent: { type: "json", data: errorData },
|
|
370
388
|
isError: true,
|
|
371
389
|
};
|
|
372
390
|
}
|
|
@@ -375,7 +393,7 @@ async function handleRunCommand(params) {
|
|
|
375
393
|
/**
|
|
376
394
|
* Expanded-tool dispatcher — parse `unicli_<site>_<command>` back to its
|
|
377
395
|
* components and call the resolver. Returns `undefined` when the tool name
|
|
378
|
-
* is not in expanded form, so the caller can fall through to
|
|
396
|
+
* is not in expanded form, so the caller can fall through to default-tool
|
|
379
397
|
* handling (list_adapters / run_command).
|
|
380
398
|
*/
|
|
381
399
|
async function handleExpandedTool(toolName, args) {
|
|
@@ -394,21 +412,30 @@ async function handleExpandedTool(toolName, args) {
|
|
|
394
412
|
return runResolvedCommand(entry.adapter, entry.cmd, entry.cmdName, args);
|
|
395
413
|
}
|
|
396
414
|
// ── MCP Protocol Handler ────────────────────────────────────────────────────
|
|
397
|
-
|
|
415
|
+
// Protocol version imported from src/constants.ts (single source of truth)
|
|
416
|
+
const PROTOCOL_VERSION = MCP_PROTOCOL_VERSION;
|
|
398
417
|
function parseArgs(argv) {
|
|
399
418
|
const opts = {
|
|
400
|
-
|
|
419
|
+
expanded: false,
|
|
401
420
|
transport: "stdio",
|
|
402
421
|
port: 19826,
|
|
422
|
+
auth: false,
|
|
403
423
|
};
|
|
404
424
|
for (let i = 0; i < argv.length; i++) {
|
|
405
425
|
const a = argv[i];
|
|
406
|
-
if (a === "--
|
|
407
|
-
opts.
|
|
426
|
+
if (a === "--expanded")
|
|
427
|
+
opts.expanded = true;
|
|
428
|
+
else if (a === "--auth")
|
|
429
|
+
opts.auth = true;
|
|
408
430
|
else if (a === "--transport") {
|
|
409
431
|
const v = argv[++i];
|
|
410
|
-
if (v === "stdio" || v === "http")
|
|
432
|
+
if (v === "stdio" || v === "http" || v === "streamable") {
|
|
411
433
|
opts.transport = v;
|
|
434
|
+
}
|
|
435
|
+
else if (v === "sse") {
|
|
436
|
+
// Deprecated alias — SSE replaced by Streamable HTTP in spec 2025-03-26
|
|
437
|
+
opts.transport = "streamable";
|
|
438
|
+
}
|
|
412
439
|
}
|
|
413
440
|
else if (a === "--port") {
|
|
414
441
|
const v = parseInt(argv[++i], 10);
|
|
@@ -429,7 +456,8 @@ function buildHandler(tools) {
|
|
|
429
456
|
result: {
|
|
430
457
|
protocolVersion: PROTOCOL_VERSION,
|
|
431
458
|
capabilities: {
|
|
432
|
-
tools: {},
|
|
459
|
+
tools: { listChanged: false },
|
|
460
|
+
elicitation: { supported: true },
|
|
433
461
|
},
|
|
434
462
|
serverInfo: {
|
|
435
463
|
name: "unicli",
|
|
@@ -438,6 +466,8 @@ function buildHandler(tools) {
|
|
|
438
466
|
},
|
|
439
467
|
};
|
|
440
468
|
case "notifications/initialized":
|
|
469
|
+
// JSON-RPC notifications must not receive responses.
|
|
470
|
+
// Returning a sentinel that transports check before serializing.
|
|
441
471
|
return null;
|
|
442
472
|
case "tools/list":
|
|
443
473
|
return {
|
|
@@ -456,17 +486,67 @@ function buildHandler(tools) {
|
|
|
456
486
|
}
|
|
457
487
|
const toolArgs = params.arguments ?? {};
|
|
458
488
|
switch (params.name) {
|
|
489
|
+
// Support both old names (list_adapters, run_command) and new
|
|
490
|
+
// names (unicli_list, unicli_run) for backwards compatibility.
|
|
491
|
+
case "unicli_list":
|
|
459
492
|
case "list_adapters": {
|
|
460
493
|
const result = handleListAdapters(toolArgs);
|
|
461
|
-
return { jsonrpc: "2.0", id, result };
|
|
494
|
+
return { jsonrpc: "2.0", id, result: annotateIfLarge(result) };
|
|
462
495
|
}
|
|
496
|
+
case "unicli_run":
|
|
463
497
|
case "run_command":
|
|
464
498
|
return handleRunCommand(toolArgs).then((result) => ({
|
|
465
499
|
jsonrpc: "2.0",
|
|
466
500
|
id,
|
|
467
|
-
result,
|
|
501
|
+
result: annotateIfLarge(result),
|
|
468
502
|
}));
|
|
503
|
+
case "unicli_search": {
|
|
504
|
+
const searchQuery = toolArgs.query;
|
|
505
|
+
const searchLimit = toolArgs.limit || 5;
|
|
506
|
+
if (!searchQuery) {
|
|
507
|
+
return {
|
|
508
|
+
jsonrpc: "2.0",
|
|
509
|
+
id,
|
|
510
|
+
error: {
|
|
511
|
+
code: -32602,
|
|
512
|
+
message: "Missing required parameter: query",
|
|
513
|
+
},
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
return import("../discovery/search.js").then(({ search: searchFn }) => {
|
|
517
|
+
const results = searchFn(searchQuery, searchLimit);
|
|
518
|
+
const data = {
|
|
519
|
+
query: searchQuery,
|
|
520
|
+
count: results.length,
|
|
521
|
+
results: results.map((r) => ({
|
|
522
|
+
command: `unicli ${r.site} ${r.command}`,
|
|
523
|
+
site: r.site,
|
|
524
|
+
name: r.command,
|
|
525
|
+
description: r.description,
|
|
526
|
+
score: r.score,
|
|
527
|
+
category: r.category,
|
|
528
|
+
usage: r.usage,
|
|
529
|
+
})),
|
|
530
|
+
};
|
|
531
|
+
return {
|
|
532
|
+
jsonrpc: "2.0",
|
|
533
|
+
id,
|
|
534
|
+
result: annotateIfLarge({
|
|
535
|
+
content: [
|
|
536
|
+
{
|
|
537
|
+
type: "text",
|
|
538
|
+
text: JSON.stringify(data, null, 2),
|
|
539
|
+
},
|
|
540
|
+
],
|
|
541
|
+
structuredContent: { type: "json", data },
|
|
542
|
+
}),
|
|
543
|
+
};
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
case "unicli_explore":
|
|
469
547
|
case "unicli_discover": {
|
|
548
|
+
// unicli_explore is the canonical name (v0.211.1+).
|
|
549
|
+
// unicli_discover kept as alias for backwards compatibility.
|
|
470
550
|
const discoverUrl = toolArgs.url;
|
|
471
551
|
const discoverGoal = toolArgs.goal;
|
|
472
552
|
if (!discoverUrl) {
|
|
@@ -479,6 +559,17 @@ function buildHandler(tools) {
|
|
|
479
559
|
},
|
|
480
560
|
};
|
|
481
561
|
}
|
|
562
|
+
if (!discoverUrl.startsWith("http://") &&
|
|
563
|
+
!discoverUrl.startsWith("https://")) {
|
|
564
|
+
return {
|
|
565
|
+
jsonrpc: "2.0",
|
|
566
|
+
id,
|
|
567
|
+
error: {
|
|
568
|
+
code: -32602,
|
|
569
|
+
message: "URL must start with http:// or https://",
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
}
|
|
482
573
|
return import("node:child_process").then(({ execFile: ef }) => import("node:util").then(({ promisify: prom }) => {
|
|
483
574
|
const execFileP = prom(ef);
|
|
484
575
|
const discoverArgs = ["generate", discoverUrl, "--json"];
|
|
@@ -490,11 +581,13 @@ function buildHandler(tools) {
|
|
|
490
581
|
}).then(({ stdout }) => ({
|
|
491
582
|
jsonrpc: "2.0",
|
|
492
583
|
id,
|
|
493
|
-
result: {
|
|
584
|
+
result: annotateIfLarge({
|
|
585
|
+
content: [{ type: "text", text: stdout }],
|
|
586
|
+
}),
|
|
494
587
|
}), (err) => ({
|
|
495
588
|
jsonrpc: "2.0",
|
|
496
589
|
id,
|
|
497
|
-
result: {
|
|
590
|
+
result: annotateIfLarge({
|
|
498
591
|
content: [
|
|
499
592
|
{
|
|
500
593
|
type: "text",
|
|
@@ -504,25 +597,44 @@ function buildHandler(tools) {
|
|
|
504
597
|
},
|
|
505
598
|
],
|
|
506
599
|
isError: true,
|
|
507
|
-
},
|
|
600
|
+
}),
|
|
508
601
|
}));
|
|
509
602
|
}));
|
|
510
603
|
}
|
|
511
604
|
default:
|
|
512
605
|
return handleExpandedTool(params.name, toolArgs).then((result) => {
|
|
513
606
|
if (result)
|
|
514
|
-
return { jsonrpc: "2.0", id, result };
|
|
607
|
+
return { jsonrpc: "2.0", id, result: annotateIfLarge(result) };
|
|
515
608
|
return {
|
|
516
609
|
jsonrpc: "2.0",
|
|
517
610
|
id,
|
|
518
611
|
error: {
|
|
519
|
-
code: -
|
|
520
|
-
message: `Unknown tool: ${params.name}. Use
|
|
612
|
+
code: -32602,
|
|
613
|
+
message: `Unknown tool: ${params.name}. Use unicli_list to see available commands.`,
|
|
521
614
|
},
|
|
522
615
|
};
|
|
523
616
|
});
|
|
524
617
|
}
|
|
525
618
|
}
|
|
619
|
+
case "elicitation/response": {
|
|
620
|
+
const elicitParams = req.params;
|
|
621
|
+
if (elicitParams?.id == null || !elicitParams?.response) {
|
|
622
|
+
return {
|
|
623
|
+
jsonrpc: "2.0",
|
|
624
|
+
id,
|
|
625
|
+
error: {
|
|
626
|
+
code: -32602,
|
|
627
|
+
message: "Missing id or response in elicitation/response",
|
|
628
|
+
},
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
const resolved = resolveElicitation(elicitParams.id, elicitParams.response);
|
|
632
|
+
return {
|
|
633
|
+
jsonrpc: "2.0",
|
|
634
|
+
id,
|
|
635
|
+
result: { resolved },
|
|
636
|
+
};
|
|
637
|
+
}
|
|
526
638
|
case "ping":
|
|
527
639
|
return { jsonrpc: "2.0", id, result: {} };
|
|
528
640
|
default:
|
|
@@ -596,15 +708,29 @@ async function startStdio(handler) {
|
|
|
596
708
|
* to MCP only need request/response, and starting with the simpler shape
|
|
597
709
|
* means zero new dependencies and a tiny attack surface.
|
|
598
710
|
*/
|
|
599
|
-
async function startHttp(handler, port,
|
|
711
|
+
async function startHttp(handler, port, authEnabled = false) {
|
|
712
|
+
const oauthMiddleware = authEnabled ? createOAuthMiddleware() : null;
|
|
600
713
|
const server = createServer((req, res) => {
|
|
601
|
-
|
|
714
|
+
// OAuth routes (authorize + token) — always public
|
|
715
|
+
if (authEnabled && handleOAuthRoute(req, res))
|
|
716
|
+
return;
|
|
717
|
+
// Health endpoint — always public
|
|
718
|
+
if (req.method === "GET" &&
|
|
719
|
+
(req.url === "/" || req.url === "/mcp" || req.url === "/health")) {
|
|
602
720
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
721
|
+
const adapterCount = getAllAdapters().length;
|
|
722
|
+
const commandCount = listCommands().length;
|
|
723
|
+
// Compute actual expanded tool count: 3 default tools + all adapter commands.
|
|
724
|
+
let expandedCount = 3; // default tools
|
|
725
|
+
for (const adapter of getAllAdapters()) {
|
|
726
|
+
expandedCount += Object.keys(adapter.commands).length;
|
|
727
|
+
}
|
|
603
728
|
res.end(JSON.stringify({
|
|
604
|
-
|
|
729
|
+
status: "ok",
|
|
730
|
+
adapters: adapterCount,
|
|
731
|
+
commands: commandCount,
|
|
732
|
+
tools: { default: 3, expanded: expandedCount },
|
|
605
733
|
version: VERSION,
|
|
606
|
-
tools: toolCount,
|
|
607
|
-
protocol: PROTOCOL_VERSION,
|
|
608
734
|
}));
|
|
609
735
|
return;
|
|
610
736
|
}
|
|
@@ -613,9 +739,31 @@ async function startHttp(handler, port, toolCount) {
|
|
|
613
739
|
res.end(JSON.stringify({ error: "POST /mcp" }));
|
|
614
740
|
return;
|
|
615
741
|
}
|
|
742
|
+
// OAuth middleware — block unauthenticated requests when --auth is set
|
|
743
|
+
if (oauthMiddleware?.(req, res))
|
|
744
|
+
return;
|
|
745
|
+
const MAX_BODY = 1_048_576; // 1 MB
|
|
616
746
|
const chunks = [];
|
|
617
|
-
|
|
747
|
+
let bodySize = 0;
|
|
748
|
+
let aborted = false;
|
|
749
|
+
req.on("data", (chunk) => {
|
|
750
|
+
bodySize += chunk.length;
|
|
751
|
+
if (bodySize > MAX_BODY) {
|
|
752
|
+
aborted = true;
|
|
753
|
+
res.writeHead(413, { "Content-Type": "application/json" });
|
|
754
|
+
res.end(JSON.stringify({
|
|
755
|
+
jsonrpc: "2.0",
|
|
756
|
+
id: null,
|
|
757
|
+
error: { code: -32600, message: "Request too large" },
|
|
758
|
+
}));
|
|
759
|
+
req.destroy();
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
chunks.push(chunk);
|
|
763
|
+
});
|
|
618
764
|
req.on("end", async () => {
|
|
765
|
+
if (aborted)
|
|
766
|
+
return;
|
|
619
767
|
const body = Buffer.concat(chunks).toString("utf-8");
|
|
620
768
|
let parsed;
|
|
621
769
|
try {
|
|
@@ -632,8 +780,14 @@ async function startHttp(handler, port, toolCount) {
|
|
|
632
780
|
}
|
|
633
781
|
try {
|
|
634
782
|
const response = await handler(parsed);
|
|
783
|
+
if (!response) {
|
|
784
|
+
// JSON-RPC notification — no response expected
|
|
785
|
+
res.writeHead(204);
|
|
786
|
+
res.end();
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
635
789
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
636
|
-
res.end(JSON.stringify(response
|
|
790
|
+
res.end(JSON.stringify(response));
|
|
637
791
|
}
|
|
638
792
|
catch (err) {
|
|
639
793
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -661,18 +815,38 @@ async function main() {
|
|
|
661
815
|
// Load adapters (same as CLI)
|
|
662
816
|
loadAllAdapters();
|
|
663
817
|
await loadTsAdapters();
|
|
664
|
-
|
|
818
|
+
// Three modes:
|
|
819
|
+
// default → 4 meta-tools (~200 tokens)
|
|
820
|
+
// expanded → 4 meta-tools + 956 full tool schemas (~160K tokens)
|
|
821
|
+
// deferred → 4 meta-tools + 956 lightweight stubs (~8K tokens)
|
|
822
|
+
const mode = opts.expanded ? "expanded" : "default";
|
|
823
|
+
const tools = opts.expanded ? buildExpandedTools() : buildDefaultTools();
|
|
824
|
+
// Deferred mode is auto-activated for Streamable HTTP transport (remote
|
|
825
|
+
// clients benefit most from searchHint-based discovery).
|
|
826
|
+
// For explicit control, the expanded flag takes precedence.
|
|
827
|
+
if (opts.transport === "streamable" && !opts.expanded) {
|
|
828
|
+
const deferredTools = buildDeferredTools();
|
|
829
|
+
tools.length = 0;
|
|
830
|
+
tools.push(...deferredTools);
|
|
831
|
+
}
|
|
665
832
|
const handler = buildHandler(tools);
|
|
666
833
|
const adapterCount = getAllAdapters().length;
|
|
667
834
|
const commandCount = listCommands().length;
|
|
668
835
|
if (opts.transport === "http") {
|
|
669
|
-
await startHttp(handler, opts.port,
|
|
670
|
-
|
|
836
|
+
await startHttp(handler, opts.port, opts.auth);
|
|
837
|
+
const authLabel = opts.auth ? ", OAuth enabled" : "";
|
|
838
|
+
process.stderr.write(`unicli MCP server v${VERSION} — ${adapterCount} sites, ${commandCount} commands (${tools.length} tools registered, mode=${mode}${authLabel})\n`);
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
if (opts.transport === "streamable") {
|
|
842
|
+
await startStreamableHttp(opts.port, handler, { auth: opts.auth });
|
|
843
|
+
const authLabel = opts.auth ? ", OAuth enabled" : "";
|
|
844
|
+
process.stderr.write(`unicli MCP server v${VERSION} — ${adapterCount} sites, ${commandCount} commands (${tools.length} tools, mode=${mode}, transport=streamable${authLabel})\n`);
|
|
671
845
|
return;
|
|
672
846
|
}
|
|
673
847
|
// stdio (default)
|
|
674
848
|
await startStdio(handler);
|
|
675
|
-
process.stderr.write(`unicli MCP server v${VERSION} — ${adapterCount} sites, ${commandCount} commands (${tools.length} tools registered, mode=${
|
|
849
|
+
process.stderr.write(`unicli MCP server v${VERSION} — ${adapterCount} sites, ${commandCount} commands (${tools.length} tools registered, mode=${mode})\n`);
|
|
676
850
|
}
|
|
677
851
|
main().catch((err) => {
|
|
678
852
|
process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
|