From b01c9c34c77aee85c66b146b61851629eb98ea8f Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Thu, 15 Oct 2026 07:14:22 -0700 Subject: [PATCH] Add Claude Code and Codex plugin manifests and MCP registry metadata (#756) --- .agents/plugins/marketplace.json | 20 +++++++++++ .claude-plugin/marketplace.json | 18 ++++++++++ .../yaak-cli/.claude-plugin/plugin.json | 20 +++++++++++ crates-cli/yaak-cli/README.md | 24 ++++++++++++++ crates-cli/yaak-cli/plugin.json | 33 +++++++++++++++++++ crates-cli/yaak-cli/src/commands/agent.rs | 10 +++++- npm/cli/package.json | 3 +- npm/cli/server.json | 31 +++++++++++++++++ npm/prepare-publish.js | 8 +++++ 9 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 .agents/plugins/marketplace.json create mode 100644 .claude-plugin/marketplace.json create mode 100644 crates-cli/yaak-cli/.claude-plugin/plugin.json create mode 100644 crates-cli/yaak-cli/plugin.json create mode 100644 npm/cli/server.json diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json new file mode 100644 index 000000000..05a4d8b7a --- /dev/null +++ b/.agents/plugins/marketplace.json @@ -0,0 +1,20 @@ +{ + "name": "yaak", + "interface": { + "displayName": "Yaak" + }, + "plugins": [ + { + "name": "yaak", + "source": { + "source": "local", + "path": "./crates-cli/yaak-cli" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Developer Tools" + } + ] +} diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 000000000..bb30151f3 --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/claude-code-marketplace.json", + "name": "yaak", + "description": "Plugins for Yaak, the desktop API client", + "owner": { + "name": "Yaak", + "url": "https://yaak.app" + }, + "plugins": [ + { + "name": "yaak", + "source": "./crates-cli/yaak-cli", + "description": "Build, save, and send API requests with the yaak CLI, with its MCP server for agents", + "category": "development", + "tags": ["api", "http", "rest", "graphql", "grpc", "openapi", "api-client"] + } + ] +} diff --git a/crates-cli/yaak-cli/.claude-plugin/plugin.json b/crates-cli/yaak-cli/.claude-plugin/plugin.json new file mode 100644 index 000000000..0f056c8cc --- /dev/null +++ b/crates-cli/yaak-cli/.claude-plugin/plugin.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", + "name": "yaak", + "displayName": "Yaak", + "description": "Build, save, and send API requests with the yaak CLI, with its MCP server for agents", + "author": { + "name": "Yaak", + "url": "https://yaak.app" + }, + "homepage": "https://yaak.app", + "repository": "https://github.com/mountain-loop/yaak", + "license": "MIT", + "keywords": ["api", "http", "rest", "graphql", "grpc", "openapi", "api-client"], + "mcpServers": { + "yaak": { + "command": "npx", + "args": ["-y", "@yaakapp/cli", "mcp"] + } + } +} diff --git a/crates-cli/yaak-cli/README.md b/crates-cli/yaak-cli/README.md index 32157e2da..d16ce6f47 100644 --- a/crates-cli/yaak-cli/README.md +++ b/crates-cli/yaak-cli/README.md @@ -17,6 +17,30 @@ The `yaak` CLI is primarily meant to be used by AI agents, and has the following - `--verbose` mode for extracting debug info while sending requests - The ability to send entire workspaces and folders (Supports `--parallel` and `--fail-fast`) +### Agent Setup + +Install the Yaak skill so your coding agent knows how to drive the CLI: + +```sh +yaak agent install # every agent found on this machine +npx skills add mountain-loop/yaak --skill use-yaak # or with the skills CLI +``` + +Claude Code and Codex can install it as a plugin instead. In Claude Code, run +`/plugin install yaak --marketplace mountain-loop/yaak`; the plugin also registers the +`yaak mcp` server. In Codex, run `codex plugin marketplace add mountain-loop/yaak`, +then `codex plugin add yaak@yaak`. + +Any MCP client can run the server over stdio: + +```json +{ + "mcpServers": { + "yaak": { "command": "npx", "args": ["-y", "@yaakapp/cli", "mcp"] } + } +} +``` + ### Example Prompts Use the `yaak` CLI with agents like Claude or Codex to do useful things for you. diff --git a/crates-cli/yaak-cli/plugin.json b/crates-cli/yaak-cli/plugin.json new file mode 100644 index 000000000..6817f0491 --- /dev/null +++ b/crates-cli/yaak-cli/plugin.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "yaak", + "description": "Build, save, and send API requests with the yaak CLI", + "author": { + "name": "Yaak", + "url": "https://yaak.app" + }, + "homepage": "https://yaak.app", + "repository": "https://github.com/mountain-loop/yaak", + "license": "MIT", + "keywords": ["api", "http", "rest", "graphql", "grpc", "openapi", "api-client"], + "extensions": { + "com.openai": { + "interface": { + "displayName": "Yaak", + "shortDescription": "Build, save, and send API requests with Yaak", + "longDescription": "Teaches the agent the yaak CLI: create workspaces, requests, environments, and auth, send one request or a whole suite, chain responses, and import OpenAPI, Postman, Insomnia, Bruno, or cURL. Requests are saved to Yaak, so you can open them in the desktop app.", + "developerName": "Yaak", + "category": "Developer Tools", + "capabilities": ["Read", "Write"], + "websiteURL": "https://yaak.app", + "privacyPolicyURL": "https://yaak.app/privacy", + "termsOfServiceURL": "https://yaak.app/terms", + "defaultPrompt": [ + "Create Yaak requests for every route in this API", + "Import this OpenAPI spec into a Yaak workspace", + "Send my Yaak requests against staging and report failures" + ] + } + } + } +} diff --git a/crates-cli/yaak-cli/src/commands/agent.rs b/crates-cli/yaak-cli/src/commands/agent.rs index 3bc470106..8c41d6d9f 100644 --- a/crates-cli/yaak-cli/src/commands/agent.rs +++ b/crates-cli/yaak-cli/src/commands/agent.rs @@ -184,6 +184,14 @@ fn installed_version(dir: &Path) -> Option { .filter(|v| !v.is_empty() && v != VERSION_PLACEHOLDER) } +/// A skill installed by a plugin manager or `npx skills add` keeps the unstamped +/// placeholder; that manager owns its updates, so it is not ours to call stale. +fn is_plugin_managed(dir: &Path) -> bool { + fs::read_to_string(dir.join("SKILL.md")) + .map(|text| text.contains(VERSION_PLACEHOLDER)) + .unwrap_or(false) +} + /// Health summary appended to root `--help`, so an agent can notice in one command /// that an upgraded CLI has left the installed skill behind. Silent when nothing is /// installed anywhere, to avoid nagging users who do not use agent tooling. @@ -195,7 +203,7 @@ pub fn help_section() -> Option { let mut installed = 0usize; for target in &targets { let dir = target.skills_dir.join(SKILL_NAME); - if !dir.join("SKILL.md").exists() { + if !dir.join("SKILL.md").exists() || is_plugin_managed(&dir) { continue; } installed += 1; diff --git a/npm/cli/package.json b/npm/cli/package.json index 1601d7a1d..0c9df2765 100644 --- a/npm/cli/package.json +++ b/npm/cli/package.json @@ -22,5 +22,6 @@ "@yaakapp/cli-linux-x64": "0.0.1", "@yaakapp/cli-win32-arm64": "0.0.1", "@yaakapp/cli-win32-x64": "0.0.1" - } + }, + "mcpName": "io.github.mountain-loop/yaak" } diff --git a/npm/cli/server.json b/npm/cli/server.json new file mode 100644 index 000000000..5a3132fee --- /dev/null +++ b/npm/cli/server.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", + "name": "io.github.mountain-loop/yaak", + "title": "Yaak", + "description": "Create, edit, and send HTTP requests in the Yaak desktop API client", + "websiteUrl": "https://yaak.app/docs/getting-started/mcp-server", + "repository": { + "url": "https://github.com/mountain-loop/yaak", + "source": "github", + "id": "602379707", + "subfolder": "npm/cli" + }, + "version": "0.0.1", + "packages": [ + { + "registryType": "npm", + "registryBaseUrl": "https://registry.npmjs.org", + "identifier": "@yaakapp/cli", + "version": "0.0.1", + "transport": { + "type": "stdio" + }, + "packageArguments": [ + { + "type": "positional", + "value": "mcp" + } + ] + } + ] +} diff --git a/npm/prepare-publish.js b/npm/prepare-publish.js index f576b9ff3..a5da2b87b 100644 --- a/npm/prepare-publish.js +++ b/npm/prepare-publish.js @@ -74,4 +74,12 @@ for (const pkg of packages) { writeFileSync(filepath, `${JSON.stringify(json, null, 2)}\n`); } +const serverJsonPath = join(__dirname, "cli", "server.json"); +const serverJson = JSON.parse(readFileSync(serverJsonPath, "utf-8")); +serverJson.version = version; +for (const pkg of serverJson.packages) { + pkg.version = version; +} +writeFileSync(serverJsonPath, `${JSON.stringify(serverJson, null, 2)}\n`); + console.log(`Prepared @yaakapp/cli npm packages for ${version}`);