From c53e5b3347e8472e1487c3ced346589b18144721 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 9 Sep 2026 19:38:27 +0000 Subject: [PATCH] myna: /myna:directory, for listing the product rather than posting about it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit myna 0.17.0 submits a product to a software directory over that directory's MCP server. This is the slash command for it, and most of the file is about the ways it is not `/myna:post`. A listing is the product, not a message about it: it is reviewed by a person, then indexed by search engines and assistants. So the command insists on `--dry-run` first, which here really is a preview of what will be sent, unlike `--dry-run` on `myna post` which only resolves targets. It also says plainly that a successful submit means "pending", not "live", because reporting a queued listing as published is the easy mistake. Two things nothing here can do, stated so they are not worked around: signing in to SaaSRow needs an emailed code typed by a person, and a directory can never be reached through `--to all` — its credentials are kept in a different part of the vault precisely so a stray post cannot become a product submission. Custom directories get a section of their own, since `myna directory tools ` is the first thing to look at when a submission is refused: it prints what that MCP server actually accepts. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_014Y6zh8EdV54VKSFfWCiB3y --- .claude-plugin/marketplace.json | 2 +- package.json | 2 +- plugins/myna/.claude-plugin/plugin.json | 4 +- plugins/myna/README.md | 1 + plugins/myna/commands/directory.md | 98 +++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 plugins/myna/commands/directory.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index ba63292..fca757d 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -103,7 +103,7 @@ }, { "name": "myna", - "description": "Post, schedule and read across 26 social networks from the terminal. Name the targets before anything goes out — the default is every account you have — queue for later, read back what landed and what failed, and draft copy the writer never publishes on its own. Accounts live in myna's own encrypted vault, not here.", + "description": "Post, schedule and read across 26 social networks from the terminal. Name the targets before anything goes out — the default is every account you have — queue for later, read back what landed and what failed, and draft copy the writer never publishes on its own. It also lists the product itself in software directories, over their MCP servers, which is a separate act from posting. Accounts live in myna's own encrypted vault, not here.", "source": "./plugins/myna", "category": "productivity", "author": { diff --git a/package.json b/package.json index 6d8c31f..79e84ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@profullstack/cli-tools", - "version": "0.30.0", + "version": "0.31.0", "private": true, "description": "Local command-line tools, in TypeScript, exposed on PATH.", "type": "module", diff --git a/plugins/myna/.claude-plugin/plugin.json b/plugins/myna/.claude-plugin/plugin.json index c335bd3..445f136 100644 --- a/plugins/myna/.claude-plugin/plugin.json +++ b/plugins/myna/.claude-plugin/plugin.json @@ -1,8 +1,8 @@ { "$schema": "https://anthropic.com/claude-code/plugin.schema.json", "name": "myna", - "description": "Post, schedule and read across 26 social networks from the terminal: name the targets before anything goes out, queue for later, read back what landed and what failed, and draft copy the writer never publishes on its own.", - "version": "0.1.0", + "description": "Post, schedule and read across 26 social networks from the terminal: name the targets before anything goes out, queue for later, read back what landed and what failed, and draft copy the writer never publishes on its own. Also lists the product itself in software directories, over their MCP servers.", + "version": "0.2.0", "author": { "name": "profullstack", "url": "https://profullstack.com" diff --git a/plugins/myna/README.md b/plugins/myna/README.md index 0123fe5..c981276 100644 --- a/plugins/myna/README.md +++ b/plugins/myna/README.md @@ -13,6 +13,7 @@ and what failed. | `/myna:feed` | Read a timeline, the history of what was sent, and the engagement. | | `/myna:draft` | Draft copy from a topic or a link. It never posts on its own. | | `/myna:infographic` | Render a graphic whose text is exactly the copy chosen for it. | +| `/myna:directory` | List the product itself in a software directory, over its MCP server. | | `/myna:mcp` | Give an agent the same vault over MCP, without a login tool. | ## Install diff --git a/plugins/myna/commands/directory.md b/plugins/myna/commands/directory.md new file mode 100644 index 0000000..0ed0d0e --- /dev/null +++ b/plugins/myna/commands/directory.md @@ -0,0 +1,98 @@ +--- +description: List a product in a software directory over that directory's MCP server — a listing, not a post, and it is public and reviewed by a person. +argument-hint: +allowed-tools: Bash(myna:*), Read +--- + +## Task + +Submit `$ARGUMENTS`. + +```bash +myna directory # what is connected +myna directory saasrow https://example.com --dry-run +myna directory saasrow https://example.com +myna directory listings +``` + +myna reads the product's page, works out the name, writes the description and +picks the category and vocabulary terms the directory accepts, then sends it +over that directory's MCP server. + +## This is not `myna post`, and the difference matters + +A post tells people about the product. A **listing is the product**: a name, a +website, a description, a category, reviewed by a human being at the directory +and then indexed by search engines and assistants. They have separate commands, +separate credentials and separate consequences. + +Directories are deliberately **not** in `--to all` and never can be. Their +credentials live in a different part of the vault for exactly that reason: a +stray thought must not be submittable as a product. + +## Run `--dry-run` first, always + +`--dry-run` prints the listing myna would send and exits without sending it. It +is a real preview — the same fields, in the same shape — unlike `--dry-run` on +`myna post`, which only resolves targets. + +Do this before every first submission of a URL. The description will be read by +a reviewer and then by everyone; getting the name wrong, or letting a tagline +land in the name field, is publicly visible and needs a human to fix. + +Anything wrong is a flag rather than a reason to give up: + +| Flag | Does | +| --- | --- | +| `--name` | the product's name, when the page's title is not it | +| `--description` | replaces what the writer produced | +| `--category` | must be one the directory accepts (`myna directory categories `) | +| `--tags a,b` | comma list, or repeat the flag | +| `--platforms`, `--audiences`, `--use-cases` | controlled vocabulary (`myna directory vocabulary `) | +| `--pricing` | one vocabulary term | +| `--no-ai` | describe it from the page's metadata instead of the writer | +| `--dry-run` | build it and stop | +| `--json` | machine output | + +## Signing in is a person's job + +`myna directory login saasrow` mails a one-time code to an email address and +waits for it to be typed back. **Nothing here can complete that**, and neither +can the MCP tools — there is deliberately no login tool. If a submission fails +with "Not signed in", say so and stop; do not try to work around it. + +A custom directory (below) is different: it takes an API key the person already +has, so it can be scripted, but the key still has to come from them. + +## Any MCP server, not just the ones myna ships + +```bash +myna directory catalog # endpoints myna knows +myna directory add acme https://acme.example/api/mcp # anything else +myna directory tools acme # what it actually offers +myna directory drop acme +``` + +There is no adapter behind the second one. myna reads the server's tool table, +finds whichever tool creates a listing whatever it is called, and sends fields +under the names *that tool's schema* uses. When a submission is refused and the +reason is not obvious, `myna directory tools ` is the first thing to look +at: it shows what the server really accepts, which is usually the answer. + +## What a submission does not do + +It does not publish. Every directory here reviews first, so a successful +submit means "queued for a person to look at", and the returned status says +`pending`. Do not report a listing as live. `myna directory listings` shows +where each one actually stands. + +Submitting the same website twice is refused by the directory, not by myna, and +the error comes back as the directory worded it. Check `myna directory listings` +before assuming a URL is unlisted. + +## Over MCP + +An agent reaches the same thing with `myna_directories`, +`myna_directory_preview`, `myna_directory_submit` and +`myna_directory_listings`. `myna_directory_preview` is the `--dry-run` +equivalent and should be called first for the same reason.