{"id":"d01f3563-27d0-4bbf-8f46-1d8c2c2ce14f","entityType":"agent","slug":"clawhub-fspecii-worthtotry-skill","name":"Worthtotry Skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-fspecii-worthtotry-skill","canonicalPath":"/agent/clawhub-fspecii-worthtotry-skill","generatedAt":"2026-10-11T03:56:37.320Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":null},"description":"Submit AI tools to WorthToTry by sending their URL and email for a draft listing and founder note review link via email.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s176eqk4satpt80gchcg9w0pa1884h56:worthtotry-skill","sourceUrl":"https://clawhub.ai/fspecii/worthtotry-skill","homepage":"https://clawhub.ai/fspecii/skills/worthtotry-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/fspecii/worthtotry-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/fspecii/skills/worthtotry-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Worthtotry Skill technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":null},"stars":null,"forks":null,"downloads":1203,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:36:03.595Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T01:36:03.658Z","lastCrawledAt":"2026-10-11T01:36:03.595Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T01:36:03.595Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-08-23T14:52:57.428Z","changelog":"- Initial release allowing users to draft and submit a product listing to WorthToTry using a simple POST with URL and owner's email. - Detailed, step-by-step instructions for auditing the product page, writing key listing fields, and communicating readiness checks. - Clarifies the submission flow: agent can only draft, while the owner must finalize via an emailed link. - Explains the importance and handling of the \"badge\" for verified listing status. - Notes strict limitations: agents cannot publish, pay for, or finalize listings; always require owner action to complete submission. - Lists and explains all readiness checks and correct responses for both agents and owners.","fileCount":9,"zipByteSize":17797}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s176eqk4satpt80gchcg9w0pa1884h56:worthtotry-skill","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s176eqk4satpt80gchcg9w0pa1884h56:worthtotry-skill` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/fspecii/worthtotry-skill before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T03:56:37.318Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fspecii-worthtotry-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":null},"readme":"Skill: Worthtotry Skill\n\nOwner: fspecii\n\nSummary: Submit AI tools to WorthToTry by sending their URL and email for a draft listing and founder note review link via email.\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-08-23T14:52:57.428Z | auto\n\n- Initial release allowing users to draft and submit a product listing to WorthToTry using a simple POST with URL and owner's email.\n- Detailed, step-by-step instructions for auditing the product page, writing key listing fields, and communicating readiness checks.\n- Clarifies the submission flow: agent can only draft, while the owner must finalize via an emailed link.\n- Explains the importance and handling of the \"badge\" for verified listing status.\n- Notes strict limitations: agents cannot publish, pay for, or finalize listings; always require owner action to complete submission.\n- Lists and explains all readiness checks and correct responses for both agents and owners.\n\nArchive index:\n\nArchive v0.1.0: 9 files, 17797 bytes\n\nFiles: README.md (4435b), references (0b), references/listing-fields.md (5471b), references/mcp-tools.md (7184b), references/readiness-checks.md (4706b), references/rest-api.md (3352b), skill-card.md (2875b), SKILL.md (11746b), _meta.json (135b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: submit-to-worthtotry\ndescription: Use when someone wants their product listed on WorthToTry, the AI tool directory. One POST with their URL and email lists it: no account, no API key and no browser consent screen, and we email them a link that finishes it. Covers writing the listing including the founder's own note, what the readiness checks mean, and the badge worth asking them to add. Also use when they say \"submit my tool\", \"list my product\", \"launch on WorthToTry\", or ask why a listing was sent back.\n---\n\n# Submit a tool to WorthToTry\n\nWorthToTry is a directory of AI tools with a weekly launch board. You can do the whole submission\nyourself: audit the page, write the listing, and send it. The person you are helping does one thing,\nwhich is opening a link we email them.\n\nRead `references/listing-fields.md` before you write any copy, `references/readiness-checks.md` for\nwhat each audit check means, and `references/rest-api.md` for the endpoint in full. Read\n`references/mcp-tools.md` only if the person already has the MCP server connected; the endpoint\nbelow needs nothing set up and is the shorter path.\n\n## The short way, with no account and no browser\n\n`POST https://worthtotry.com/api/v1/submissions` with a JSON body carrying `url` and the owner's\n`email`. No token, no OAuth, no consent screen. We email them a link; one click sends the listing\nfor review and there is nothing else for them to do.\n\n```\ncurl -X POST https://worthtotry.com/api/v1/submissions \\\n  -H 'content-type: application/json' \\\n  -d '{\"url\":\"https://theirproduct.com\",\"email\":\"them@theircompany.com\"}'\n```\n\n### Fill it in yourself. Do not leave it to us.\n\nWe read the page and draft a listing from it, and every other directory reads the same page. What\nyou write is what makes the listing worth reading, and it is the part search has not seen before, so\nsend all of it:\n\n| Field | Why it is worth your time |\n| --- | --- |\n| `description` | Ours is extracted. Yours can say what the product does that its homepage does not spell out. |\n| `firstComment` | **The founder's own note**, in their words, shown on the listing at launch. Ask them for it. It cannot be written from the product page, and it is the only text here another directory will not also have. |\n| `tagline`, `name` | Override ours when the extraction reads oddly. |\n| `categories`, `pricing`, `openSource` | Correct these rather than letting a guess stand. |\n| `targetKeyword` | The phrase they want to be found by. We leave it empty; it is their decision, not ours. |\n\nAsk the person for the founder note before you submit. \"Anything you want to say about why you built\nit?\" gets a better listing than anything either of us can infer.\n\n### What happens after you submit\n\nYou get a response saying we emailed the owner. They open that link and the listing goes for review;\nthere is no form, no account and no second step. A listing that clears the check goes up on its own,\nand anything else waits for a person.\n\nThe page they land on asks them for one thing, and you should ask for it too.\n\nThe response carries `badge`. **Pass it on.** Putting the badge on their site earns a verified mark\non the listing, a place in the verified filter, and the tiebreaker when two listings have the same\nnumber of votes. It is checked automatically on the next sweep. Say what it is and what it is not:\na tiebreaker rather than a ladder, and skipping it takes nothing away. Do not tell them it makes\nmoderation faster, because it does not.\n\nThe MCP server is the same job with a session attached, and it needs one browser approval. Use the\nendpoint above unless the person already has an account.\n\n## Know your ceiling before you start\n\nYou can open a draft. That is the whole of your authority.\n\nYou **cannot**:\n\n- publish a listing, or submit it for review\n- choose or change a launch date\n- pay for anything — the paid launch tiers, featured placement, ads\n- upload a screenshot (one is captured when the draft is opened in a browser)\n- write the first comment on the listing\n\nA person finishes every submission. Say so up front, before you run anything: tell them you will\ndraft the listing and hand back a review link, and that they open that link to finish. Do not\npromise a launch, a date, or a published page. If they ask you to publish, tell them the directory\ndoes not let an agent do that and give them the review link instead.\n\n## 1. Connect the MCP server\n\nReads work with no account and no key. Run this once:\n\n```\nclaude mcp add --transport http worthtotry https://worthtotry.com/api/mcp/\n```\n\nFor a client that uses a config file, add:\n\n```json\n{\n  \"mcpServers\": {\n    \"worthtotry\": {\n      \"type\": \"http\",\n      \"url\": \"https://worthtotry.com/api/mcp/\"\n    }\n  }\n}\n```\n\nSix tools appear: `search_tools`, `get_tool`, `list_categories`, `check_submission_readiness`,\n`submit_tool`, `get_my_submissions`.\n\nThe first four need no authorization. `submit_tool` and `get_my_submissions` do: the first call\nreturns a 401, your client opens a browser, and the person approves the connection once. Two scopes\nare requested — `submit` (open draft listings on their behalf) and `read:submissions` (see their\nlistings and status). No token passes through the conversation. If your client does not do OAuth,\nfall back to `references/rest-api.md`, where the person creates a personal access token in their\ndashboard instead.\n\n## 2. Audit the page before anything else\n\n```\ncheck_submission_readiness(url: \"https://theproduct.com\")\n```\n\nIt fetches the page, scores it out of 100, returns one entry per check with a `status` of `pass`,\n`warn` or `fail` plus a `fix` string, and drafts the listing it would produce in `suggestedListing`.\nIt changes nothing.\n\nNever call `submit_tool` before this. The audit is what tells you whether the URL can be listed at\nall, and its `fix` strings are the work you should be doing for the person.\n\n## 3. Act on the six checks\n\n| id                 | Non-passing status | Blocks submission | What it is                                   |\n| ------------------ | ------------------ | ----------------- | -------------------------------------------- |\n| `title`            | `fail`             | No                | The page has a `<title>`                     |\n| `meta-description` | `warn`             | No                | A meta description is present                |\n| `og-image`         | `warn`             | No                | A social share image is set                  |\n| `logo`             | `fail`             | No                | An icon usable as a listing logo was found   |\n| `duplicate`        | `fail`             | **Yes**           | No existing listing already claims this host |\n| `badge`            | `info`             | No                | The page links back to the directory         |\n\nOnly `duplicate` blocks a submission — `submittable` is false exactly when it fails, and\n`submit_tool` will refuse. `fail` and `warn` are quality problems you should still fix, because a\nlisting that goes to review with a missing logo comes back.\n\nFor every check that is `fail` or `warn`, read its `fix` and do one of three things:\n\n1. **You can edit their site** — apply the fix, then re-run the audit and show the new score.\n2. **You cannot** — quote the `fix` verbatim to the person as a task.\n3. **`duplicate` failed** — stop. The product is already listed. The `detail` names the existing\n   listing path; give them that and tell them to claim or update it rather than submitting again.\n\n`badge` is different and is the one to get right. It is `info`, it carries no weight in the score,\nand **the badge is not required** — launching is free and the listing is identical whether or not\nthe link is there. No plan sells an exemption from it, because there is nothing to be exempt from.\n\nWhat the link earns, and the whole of it: a verified mark on the listing, inclusion in the verified\nfilter at `/tools?verified=1`, and the tiebreaker in the ranking, so two listings level on votes are\nseparated by the one whose site links back. It never lifts a listing above one with more votes.\n\nMention it once, with that upside, and quote the `fix` verbatim if they want the snippet. Do not\ncall it a requirement, a cost, or something to fix, and do not decide for them.\n\n`references/readiness-checks.md` has each check's exact `fix` text and what it is worth in the score.\n\n## 4. Draft the listing\n\nRead `references/listing-fields.md` first. The limits are enforced, and copy that overruns is\nrejected, not truncated.\n\nThe short version:\n\n- `name` — 40 characters\n- `tagline` — 60 characters, no trailing period\n- `description` — 40 to 600 characters\n- `targetKeyword` — 100 characters, one keyword, no commas\n- `categories` — at least 1, at most 3\n\nLeave `targetKeyword` empty unless the person tells you what it is. It is their SEO decision and a\nguess is worse than a blank field.\n\nStart from `suggestedListing` in the audit result and override only what is wrong. Show the person\nyour copy before you submit it — it goes out under their product's name.\n\nThen:\n\n```\nsubmit_tool(\n  url: \"https://theproduct.com\",\n  name: \"...\",\n  tagline: \"...\",\n  description: \"...\",\n  categories: [\"developer-tools\", \"productivity\"],\n  pricing: \"freemium\",\n  openSource: false\n)\n```\n\nEvery field except `url` is optional; anything you omit falls back to what the audit extracted.\n\n## 5. Hand it back\n\n`submit_tool` returns `slug`, `status` (`draft`), `reviewUrl`, `readinessScore` and `warnings`.\n\nGive the person the `reviewUrl` and tell them plainly what is left for them:\n\n- The draft has **no screenshot**. One is captured when they open the review link in a browser, and\n  at least one is required before the listing can go to review.\n- If no logo could be extracted, they upload one there.\n- The **first comment** — up to 200 characters, posted automatically when the listing is approved —\n  can only be written in that form. You cannot set it.\n- They press submit for review, and pick a launch date or let it publish on approval.\n\nRepeat every warning in `warnings` as a checklist item. Do not summarise them away; each one is a\nreason the listing would come back.\n\nAfter that the listing moves `draft → pending → approved → published`. Call `get_my_submissions` to\nreport where it stands; it returns the status, any `rejectionReason`, and the review link again.\n\n## Writing rules that will get content rejected\n\nTwo fields reject links outright — not sanitised, rejected with an error naming the text that\ntriggered it:\n\n- the **first comment** on a listing\n- a founder's **launch story** blog post\n\nThat covers markdown links, `<a>` and `<iframe>` tags, bare `http://` URLs, `www.` prefixes, and a\nbare host followed by a path. Write those two in plain prose with no URLs at all. The listing\nalready links to the product; anything more would make the posts worth writing purely for SEO, which\nis why the rule exists.\n\nComments and launch stories go over REST, not MCP — see `references/rest-api.md`.\n\n## When something goes wrong\n\n- **`submit_tool` returns a 401** — the connection is not authorized. Tell the person to approve it\n  in the browser window their client opened; do not retry in a loop.\n- **The audit says the site returned an HTTP error, or could not be reached** — that is their site,\n  not the directory. Report it and stop.\n- **The audit rejects the URL as invalid or unsafe** — the fetcher refuses private and loopback\n  addresses. A staging URL on localhost cannot be audited; they need a public page.\n- **`submit_tool` fails with a duplicate message** — see step 3. Do not try a different URL on the\n  same host to get around it; the check is on the host, not the exact URL.\n\nFile v0.1.0:README.md\n\n# submit-to-worthtotry: list an AI tool in under 30 seconds\n\nAn agent skill that lets Claude, Codex, Cursor, Gemini or any other AI assistant\nlist a product on [WorthToTry](https://worthtotry.com), a free directory of AI\ntools. The agent reads the product page, runs the readiness checks, writes the\nlisting and submits it. The person it is working for clicks one link in one\nemail, and that is their whole part.\n\nNo account. No API key. No OAuth screen. No MCP server to install.\n\n## The whole thing\n\nSay this to your agent:\n\n```\nInstall the skill at https://worthtotry.com/skill.md and list my product on WorthToTry.\n```\n\nThat is the short path and it needs nothing set up: the skill is one Markdown\nfile at a URL, and an agent fetches it the way it fetches any other page.\n\nIf you would rather keep a copy, pinned to a version or on a machine with no\nnetwork, clone this repository into your skills directory instead:\n\n```bash\ngit clone https://github.com/fspecii/worthtotry-skill ~/.claude/skills/submit-to-worthtotry\n```\n\nSetup for Codex, Cursor, Windsurf and Gemini is at the bottom of this page.\n\n## Where the 30 seconds comes from\n\nIt is measured against production rather than estimated: 0.24s to fetch the\nskill, 1.7s to audit the page and draft the listing, and 6s for the whole\nsubmission call including the logo fetch and the email. The agent's side is\nunder ten seconds of network work; the rest is somebody pasting one sentence.\n\nWhat it deliberately does not claim is that the listing is *live* in 30 seconds.\nThat waits on a person opening their inbox, and then on a review.\n\n## What the agent actually does\n\n| Step | What happens |\n| --- | --- |\n| Reads your page | Fetches the URL and extracts the title, description, logo and pricing |\n| Audits it | Seven readiness checks, each with a specific fix it reports back |\n| Writes the listing | Name, tagline, description, categories, pricing, within the field limits |\n| Asks you one thing | The founder's note, in your words. It cannot be written from your page |\n| Submits | One `POST` carrying the URL and your email address |\n| Hands back | The badge snippet, and what is still yours to do |\n\n## What it cannot do\n\nThe skill states this in its opening lines, because an agent that oversells what\nit can do is worse than no agent.\n\n- It cannot confirm the submission. That takes the link emailed to the address on\n  it, so a listing cannot appear for a product whose owner never agreed to it.\n- It cannot decide whether the listing is published. Every submission is\n  reviewed, and anything the review will not pass waits for a person.\n- It cannot choose a launch date or pay for anything. There is no endpoint that\n  would let it.\n\n## What is in here\n\n| File | What it covers |\n| --- | --- |\n| `SKILL.md` | The workflow: audit, draft, submit, hand back |\n| `references/listing-fields.md` | Field limits, categories, the no-links rule |\n| `references/readiness-checks.md` | The seven audit checks and the fix for each |\n| `references/rest-api.md` | The endpoint, its body and what it returns |\n| `references/mcp-tools.md` | The same job over MCP, for agents already set up that way |\n\nThe agent reads `SKILL.md` and pulls in a reference only when it needs one, so a\nquestion about categories does not cost it the whole REST spec.\n\n## Listing is free\n\nNo badge requirement, no backlink requirement, and nothing on the directory is\nranked by what anyone paid. Carrying the badge earns a verified mark and the\ntiebreaker between two listings on the same number of votes; skipping it takes\nnothing away.\n\n## Other agents\n\nThe skill is plain Markdown, so anything that can read a file can use it.\n\n| Agent | Where to put it |\n| --- | --- |\n| Claude Code | `~/.claude/skills/submit-to-worthtotry/` for every project, or `.claude/skills/` inside one repo |\n| Codex | Point it at the raw `SKILL.md`, or add the folder to `AGENTS.md` |\n| Cursor | `.cursor/rules/`, or reference the raw URL in a rule |\n| Windsurf | `.windsurf/rules/` |\n| Gemini CLI | `GEMINI.md`, or fetch the URL in the prompt |\n\nOr skip all of it and paste the one line at the top of this page.\n\n## Links\n\n- The directory: <https://worthtotry.com>\n- The skill, always current: <https://worthtotry.com/skill.md>\n- Submit in a browser instead: <https://worthtotry.com/submit>\n- The API: <https://worthtotry.com/api-docs>\n- Where else to launch, with prices read by hand: <https://worthtotry.com/directories>\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn78723fxbzx59hd67ysawak0n81fsmq\",\n  \"slug\": \"worthtotry-skill\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1787496777428\n}\n\nFile v0.1.0:references/listing-fields.md\n\n# Listing fields\n\nLimits are enforced by the validator. Copy that overruns is rejected with an error, not truncated.\n\n## The draft\n\n| Field           | Limit | Rules                                                                          |\n| --------------- | ----: | ------------------------------------------------------------------------------ |\n| `name`          |    40 | Required. The product's name, not a sentence.                                  |\n| `tagline`       |    60 | Required. No trailing period — it is rejected.                                 |\n| `description`   |   600 | Required, minimum 40 characters. At least a couple of sentences.               |\n| `targetKeyword` |   100 | Optional. One keyword, no commas. Leave empty unless the person supplies it.   |\n| `firstComment`  |   200 | Optional. **No links.** Browser form only — you cannot set it.                 |\n| `categories`    |     3 | At least 1, at most 3, no repeats.                                             |\n| `screenshots`   |     5 | At least 1 required before review. Captured in the browser; you cannot supply. |\n\nAlso on the draft, and not settable by you:\n\n- **logo** — required before review. Extracted from the page when the `logo` check passes, otherwise\n  uploaded in the browser.\n- **launchDate** — must be in the future. The person's choice; null means it publishes as soon as a\n  moderator approves.\n- **twitterHandle** — 1 to 15 letters, numbers or underscores, no `@`. You may pass this.\n- **demoVideoUrl** — YouTube or Loom only. Browser form.\n\n## Writing the copy\n\n`name` is the product name. Do not append a category or a slogan to fill the 40 characters.\n\n`tagline` says what it does for whom, in one line, with no full stop at the end. Write it so it\nreads under the name on a card, not as a headline.\n\n`description` is 40 to 600 characters. Lead with what the product does, then who it is for. Do not\nrestate the tagline. Do not open with \"In today's fast-paced world\" or any variant. No feature\nbullets padded to reach the ceiling — a tight 200 characters beats a padded 590.\n\n`targetKeyword` decides how the listing page is optimised for search. Leave it blank unless the\nperson names one. A guess here is worse than an empty field, and the audit deliberately never\nsuggests one.\n\n## Pricing\n\nOne of: `free`, `freemium`, `paid`, `subscription`, `one_time`, `contact`.\n\nThe audit defaults to `contact` when the page does not say. Do not upgrade that to `free` because a\nfree tier looks likely — pick what the page actually claims, or leave the default and ask.\n\n## Categories\n\nAt least one, at most three. Pass slugs; display names also resolve. Pick the categories a buyer\nwould browse, not every one that could apply.\n\n| Slug               | Name             | Slug             | Name           |\n| ------------------ | ---------------- | ---------------- | -------------- |\n| `ai`               | AI               | `marketing`      | Marketing      |\n| `analytics`        | Analytics        | `monitoring`     | Monitoring     |\n| `cms`              | CMS              | `music`          | Music          |\n| `communication`    | Communication    | `no-code`        | No Code        |\n| `content-creation` | Content Creation | `open-source`    | Open Source    |\n| `data`             | Data             | `productivity`   | Productivity   |\n| `design-tools`     | Design Tools     | `sales`          | Sales          |\n| `developer-tools`  | Developer Tools  | `search`         | Search         |\n| `devops`           | DevOps           | `security`       | Security       |\n| `e-commerce`       | E-Commerce       | `seo`            | SEO            |\n| `education`        | Education        | `social-media`   | Social Media   |\n| `finance`          | Finance          | `sustainability` | Sustainability |\n| `food-drink`       | Food & Drink     | `travel`         | Travel         |\n| `gaming`           | Gaming           | `video`          | Video          |\n| `health-fitness`   | Health & Fitness | `web3`           | Web3           |\n| `hr-recruiting`    | HR & Recruiting  | `writing`        | Writing        |\n| `image`            | Image            | `other`          | Other          |\n| `jobs-careers`     | Jobs & Careers   |                  |                |\n| `launch-platforms` | Launch Platforms |                  |                |\n| `legal`            | Legal            |                  |                |\n| `lifestyle`        | Lifestyle        |                  |                |\n\nCall `list_categories` to see which of these actually hold published tools, with counts.\n\n## The two link-free fields\n\nThe **first comment** (200 characters) and a founder's **launch story** (title 120, body 200 to\n20,000 characters) reject any content that links out. The error names the text that triggered it.\n\nRejected: markdown links and images, `<a>`, `<iframe>` and `<script>` tags, `http://` and `https://`\nURLs, other URL schemes, `www.` prefixes, and a bare host followed by a path such as\n`acme.com/pricing`.\n\nAllowed, because they are prose and not links: `Next.js`, `config.json`, `v2.1.0`, `1.5s`, `16:9`,\nand a bare product name like Vercel with no path after it.\n\nWrite both in plain prose. The listing already carries the link to the product.\n\n## Comments\n\nA comment is up to 2000 characters and rejects links under the same rule. One level of threading:\npass `parentId` to reply to a top-level comment.\n\nFile v0.1.0:references/mcp-tools.md\n\n# MCP tools\n\nEndpoint: `https://worthtotry.com/api/mcp/` — Streamable HTTP.\n\nEvery tool returns its payload twice: as JSON text in `content`, and as the same object in\n`structuredContent`. Parse `structuredContent`.\n\nA failing tool returns `isError: true` and a single text message. That message is written for you to\nrelay — pass it on rather than inventing your own wording.\n\n## Authorization\n\n| Tool                         | Needs authorization |\n| ---------------------------- | ------------------- |\n| `search_tools`               | No                  |\n| `get_tool`                   | No                  |\n| `list_categories`            | No                  |\n| `check_submission_readiness` | No                  |\n| `submit_tool`                | Yes                 |\n| `get_my_submissions`         | Yes                 |\n\nAuthorization is OAuth 2.1 in the browser. The first call to a protected tool returns a 401 carrying\na `WWW-Authenticate` challenge; a compliant client discovers the authorization server from it,\nregisters itself, and opens a consent page. The person approves once. Scopes:\n\n- `submit` — open draft listings on their behalf\n- `read:submissions` — see the listings they have submitted and their status\n\nAccess tokens are short-lived and refreshed by the client. You never handle one.\n\n---\n\n## `search_tools`\n\nFind listings in plain language.\n\n| Argument     | Type                                                         | Default |\n| ------------ | ------------------------------------------------------------ | ------- |\n| `query`      | string, max 120 — matched against name, tagline, description | —       |\n| `category`   | string — a category slug, e.g. `developer-tools`             | —       |\n| `pricing`    | `free` `freemium` `paid` `subscription` `one_time` `contact` | —       |\n| `openSource` | boolean                                                      | —       |\n| `sort`       | `newest` or `top` (`top` ranks by upvotes)                   | —       |\n| `limit`      | integer 1–50                                                 | 10      |\n| `cursor`     | string — pass back `nextCursor` from the previous call       | —       |\n\nReturns `{ items, nextCursor }`. Each item: `slug`, `name`, `tagline`, `url`, `categories` (display\nnames), `pricing`, `openSource`, `upvotes`, `toolUrl`.\n\n`nextCursor` is opaque. Do not construct one; page by passing back what you were given, and stop\nwhen it is null.\n\n## `get_tool`\n\n| Argument | Type                                  |\n| -------- | ------------------------------------- |\n| `slug`   | string — the slug from `search_tools` |\n\nReturns `slug`, `name`, `tagline`, `description`, `url`, `categories`, `pricing`, `openSource`,\n`upvotes`, `commentCount`, `twitterHandle`, `launchDate`, `toolUrl`.\n\nErrors if the slug does not exist or the listing is not published.\n\n## `list_categories`\n\nNo arguments. Returns `{ items }` of `{ slug, name, toolCount }` for every category that has at\nleast one published tool. Use the `slug` values when filtering a search or drafting a listing.\n\n## `check_submission_readiness`\n\n| Argument | Type                                |\n| -------- | ----------------------------------- |\n| `url`    | string — the product's homepage URL |\n\nFetches the page and returns:\n\n| Field              | What it is                                                             |\n| ------------------ | ---------------------------------------------------------------------- |\n| `url`              | The URL after redirects were followed                                  |\n| `score`            | 0–100, weighted across the six checks                                  |\n| `submittable`      | False only when the `duplicate` check fails                            |\n| `checks`           | Six objects: `id`, `label`, `status`, `detail`, `fix`                  |\n| `suggestedListing` | The listing that would be drafted, or null if too little could be read |\n| `note`             | A one-line summary of what to do next                                  |\n\n`suggestedListing` carries `name`, `tagline`, `description`, `categories`, `pricing`, `logo` and\n`twitterHandle`. `targetKeyword` is never suggested — that is deliberate.\n\nResults are cached per host for 15 minutes, so re-running straight after a fix may return the\nprevious audit.\n\nSee `readiness-checks.md` for what each check means.\n\n## `submit_tool`\n\nOpens a draft listing for the person who authorized the connection.\n\n| Argument        | Type                                                         |\n| --------------- | ------------------------------------------------------------ |\n| `url`           | string, required, max 2048 — the product's homepage          |\n| `name`          | string, max 40 — overrides the extracted name                |\n| `tagline`       | string, max 60                                               |\n| `description`   | string, max 600                                              |\n| `categories`    | array of at most 3 category slugs or display names           |\n| `pricing`       | `free` `freemium` `paid` `subscription` `one_time` `contact` |\n| `openSource`    | boolean                                                      |\n| `twitterHandle` | string, max 15                                               |\n| `targetKeyword` | string, max 100 — leave to the person                        |\n\nOnly `url` is required; every other field falls back to what the audit extracted. Category display\nnames and slugs both resolve, and anything unrecognised is dropped rather than rejected.\n\nReturns:\n\n| Field            | What it is                                                       |\n| ---------------- | ---------------------------------------------------------------- |\n| `ok`             | `true`                                                           |\n| `slug`           | The listing's slug                                               |\n| `status`         | `draft` — always                                                 |\n| `reviewUrl`      | Where the person finishes the submission                         |\n| `readinessScore` | The score from the audit it ran                                  |\n| `warnings`       | Everything left to fix, including every failing check's `detail` |\n| `note`           | A restatement of the boundary                                    |\n\nIt runs its own audit first, so a duplicate is refused here too.\n\n**It cannot publish, set a launch date, or pay.** There is no argument for any of those, and there is\nno tool that does them. There is also no argument for the first comment or for a screenshot — both\nare added in the browser.\n\n## `get_my_submissions`\n\nNo arguments. Returns `{ items }`, one per listing the authorized person owns, in any state:\n\n`slug`, `name`, `status` (`draft` `pending` `approved` `rejected` `published`), `rejectionReason`,\n`requestedLaunchDate`, `publishedAt`, `upvotes`, `views`, `badgeStatus`, `submittedVia`,\n`reviewUrl`, and `toolUrl` once published.\n\nUse it to answer \"where is my submission\" without asking the person to check the dashboard.\n\nFile v0.1.0:references/readiness-checks.md\n\n# The six readiness checks\n\n`check_submission_readiness` returns exactly these six, always in this order, each as\n`{ id, label, status, detail, fix }`. `fix` is null when the check passes.\n\n## Scoring\n\n| id                 | Weight | Status when it does not pass |\n| ------------------ | -----: | ---------------------------- |\n| `title`            |     20 | `fail`                       |\n| `meta-description` |     15 | `warn`                       |\n| `og-image`         |     15 | `warn`                       |\n| `logo`             |     15 | `fail`                       |\n| `duplicate`        |     15 | `fail`                       |\n| `badge`            |      0 | `info`                       |\n\nA `pass` earns the full weight, a `warn` earns half, a `fail` earns nothing. `score` is the total as\na percentage, rounded.\n\n`badge` carries no weight and cannot move the score in either direction, because it is not a\nproperty of the page's readiness — it is an optional extra its owner may or may not want. `info` is\nits own status for that reason: it is not a lesser `warn`. Do not present it as something to fix.\n\nThe score is information, not a gate. Nothing is blocked by a low score.\n\n`submittable` is false **only** when `duplicate` fails.\n\n---\n\n## `title` — Page title\n\nFails when the page has no `<title>`.\n\n> **detail (fail)** The page has no `<title>`.\n> **fix** Add a `<title>` describing what the product does.\n\nA missing title also weakens the drafted listing: the extracted name is derived from it, so a page\nwithout one falls back to a guess from the hostname.\n\n## `meta-description` — Meta description\n\nWarns when there is no meta description.\n\n> **detail (warn)** No meta description, so search engines will invent one.\n> **fix** Add `<meta name=\"description\" content=\"...\">` of about 150 characters.\n\n## `og-image` — Social share image\n\nWarns when there is no `og:image`.\n\n> **detail (warn)** No og:image, so links to your site share as bare text.\n> **fix** Add `<meta property=\"og:image\" content=\"https://...\">` at 1200x630.\n\nThis is not the listing screenshot. The screenshot is captured separately when the draft is opened\nin a browser.\n\n## `logo` — Logo source\n\nFails when no favicon or icon can be used as a logo.\n\n> **detail (fail)** No favicon or icon we can use as a logo.\n> **fix** Add `<link rel=\"apple-touch-icon\" href=\"...\">` with a square image, 512x512 or larger.\n\nA listing cannot go to review without a logo. If this fails, either the page gets one or the person\nuploads a file in the browser — there is no way for you to supply it. SVG icons and images that\ncannot be decoded are treated as absent.\n\n## `duplicate` — Duplicate listing\n\nFails when the host is already listed. **This is the only check that blocks a submission.**\n\n> **detail (fail)** This URL is already listed as /tools/<slug>.\n> **fix** Claim or update the existing listing instead of submitting again.\n\nMatching is on the canonical host, so `www.` and a different path will not get around it. When this\nfails, stop and hand the person the existing listing path from `detail`.\n\n## `badge` — Badge backlink (optional)\n\nReturns `info`, never `fail`, when the page HTML contains no link back to the directory.\n\n> **detail (info)** No link to <host> was found in the page HTML. Nothing here needs it — launching\n> is free either way. Adding one earns the verified mark and the tiebreaker in the ranking.\n> **fix** Optional: add this to your footer — `<a href=\"https://worthtotry.com\" target=\"_blank\" rel=\"noopener\"><img src=\"https://worthtotry.com/badges/featured.png\" alt=\"Featured on us\" width=\"244\" height=\"56\" /></a>`\n\nQuote the `fix` from the live response rather than this file — it is generated with the current\nbadge URL.\n\nThe check looks at the HTML the server returns, so a badge injected by client-side JavaScript will\nnot be seen. It is re-verified on a schedule after publication, and the listing's owner can re-run\nit on demand from their dashboard.\n\n**The badge is not required and buying your way out of it is not a thing.** Launching is free\nwhether or not the link is there, the listing is identical either way, and there is no plan that\nsells an exemption. What the link earns is narrow and worth stating exactly: a verified mark on the\nlisting, inclusion in the verified filter at `/tools?verified=1`, and the tiebreaker in the ranking\n— two listings level on votes are separated by the one whose site links back. It never lifts a\nlisting above one with more votes, and it buys nothing from a moderator.\n\nReport it as a choice with that upside. Do not describe it as a requirement, a cost, or something\nthe person needs to fix, and do not decide for them.\n\nFile v0.1.0:references/rest-api.md\n\n# REST API\n\nUse this when MCP is unavailable, when you need an endpoint MCP does not expose (comments, launch\nstories), or when the person prefers a token to an OAuth consent screen.\n\nBase URL: `https://worthtotry.com/api/v1`\nSpec: `https://worthtotry.com/api/v1/openapi.json`\nReference: `https://worthtotry.com/api-docs`\n\n## Authentication\n\nReads need nothing. Writes need `Authorization: Bearer <token>`, where the token is a personal\naccess token the person creates in their dashboard. Ask them for one; do not try to mint it.\n\nThe same ceiling applies here. Nothing in this API publishes a listing, sets a launch date, or takes\na payment.\n\n## Endpoints\n\n| Method | Path                     | Auth   | What it does                       |\n| ------ | ------------------------ | ------ | ---------------------------------- |\n| GET    | `/tools`                 | —      | Search and page the catalogue      |\n| GET    | `/tools/{slug}`          | —      | One listing in full                |\n| GET    | `/tools/{slug}/comments` | —      | Read a discussion                  |\n| POST   | `/tools/{slug}/comments` | Bearer | Comment, or reply to one           |\n| GET    | `/categories`            | —      | Every category, with counts        |\n| POST   | `/readiness`             | —      | Audit a URL before submitting      |\n| POST   | `/submissions`           | Bearer | Open a draft listing               |\n| POST   | `/posts`                 | Bearer | Add a launch story to your listing |\n| GET    | `/me/submissions`        | Bearer | Your listings and their status     |\n\n## Audit a URL\n\n```\ncurl -s -X POST \"https://worthtotry.com/api/v1/readiness\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://theproduct.com\"}'\n```\n\nSame six checks, same shape, as `check_submission_readiness`.\n\n## Open a draft\n\n```\ncurl -s -X POST \"https://worthtotry.com/api/v1/submissions\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://theproduct.com\",\"tagline\":\"...\",\"categories\":[\"developer-tools\"]}'\n```\n\nBody accepts `url` (required), `name`, `tagline`, `description`, `categories`, `pricing`,\n`openSource`, `twitterHandle`, `targetKeyword` — the same fields and the same limits as\n`submit_tool`. Returns 201 with a review link.\n\n## Add a launch story\n\n```\ncurl -s -X POST \"https://worthtotry.com/api/v1/posts\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"toolSlug\":\"the-product\",\"title\":\"...\",\"body\":\"...\",\"publishWithTool\":true}'\n```\n\n`title` up to 120 characters, `body` 200 to 20,000 characters, **no links**. It is saved as a draft:\nwith `publishWithTool` true it goes live with the listing, otherwise the author publishes it. The\nlisting must be one the caller owns, or the response is 403.\n\n## Errors\n\nEvery failure returns `{ \"ok\": false, \"error\": { \"code\", \"message\", \"fields\" } }` with a code of\n`unauthorized`, `forbidden`, `not_found`, `invalid_request`, `duplicate`, `rate_limited` or\n`server_error`. `fields` maps a field name to its message on a validation failure — relay those\nverbatim.\n\nOut-of-range values are rejected with 422, not silently clamped. A `limit` of 500 is an error, not a\npage of 50.\n\nWrites are rate limited per token; a 429 carries `retry-after` in seconds. Wait it out, do not\nretry immediately.\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nUse when someone wants their product listed on WorthToTry, the AI tool directory, by auditing the product page, drafting listing copy, submitting a draft, and handing final review back to the owner.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fspecii](https://clawhub.ai/user/fspecii)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, founders, and launch teams use this skill to prepare and submit draft WorthToTry listings for AI products. It guides an agent through readiness checks, listing field limits, API or MCP submission paths, and the owner handoff needed before review.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can send a product URL, owner email, and listing copy to WorthToTry.\n\nMitigation: Confirm the exact product URL, owner email, and listing copy before any submission call.\n\nRisk: The documented remote installation path may fetch a mutable skill file.\n\nMitigation: Install from a reviewed local copy or pinned source when possible.\n\nRisk: The REST fallback may require a personal access token for authenticated submission endpoints.\n\nMitigation: Prefer the no-token submission path when applicable, or provide tokens only through a secure secret flow after reviewing token permissions.\n\nRisk: The agent can only create a draft and may overstate completion if boundaries are not reviewed.\n\nMitigation: Tell the user up front that the owner must open the emailed review link and complete final submission steps.\n\n## Reference(s):\n\n- [ClawHub listing](https://clawhub.ai/fspecii/skills/worthtotry-skill)\n- [Server-resolved GitHub source](https://github.com/fspecii/worthtotry-skill)\n- [WorthToTry directory](https://worthtotry.com)\n- [WorthToTry API documentation](https://worthtotry.com/api-docs)\n- [WorthToTry OpenAPI specification](https://worthtotry.com/api/v1/openapi.json)\n- [Listing fields](references/listing-fields.md)\n- [Readiness checks](references/readiness-checks.md)\n- [REST API](references/rest-api.md)\n- [MCP tools](references/mcp-tools.md)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, shell commands, configuration, API calls]\n\n**Output Format:** [Markdown guidance with JSON examples, shell commands, and API or MCP call instructions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces draft listing copy, readiness findings, warnings, badge guidance, and owner handoff instructions; it does not publish listings or complete owner-only review steps.]\n\n## Skill Version(s):\n\n0.1.0 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: Worthtotry Skill Owner: fspecii Summary: Submit AI tools to WorthToTry by sending their URL and email for a draft listing and founder note review link via email. Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-23T14:52:57.428Z | auto - Initial release allowing users to draft and submit a product listing to WorthToTry using a simple POST with URL and owner's email. - Detailed, step-by-step instructions for","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"curl -X POST https://worthtotry.com/api/v1/submissions \\\n  -H 'content-type: application/json' \\\n  -d '{\"url\":\"https://theirproduct.com\",\"email\":\"them@theircompany.com\"}'"},{"language":"text","snippet":"claude mcp add --transport http worthtotry https://worthtotry.com/api/mcp/"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"worthtotry\": {\n      \"type\": \"http\",\n      \"url\": \"https://worthtotry.com/api/mcp/\"\n    }\n  }\n}"},{"language":"text","snippet":"check_submission_readiness(url: \"https://theproduct.com\")"},{"language":"text","snippet":"submit_tool(\n  url: \"https://theproduct.com\",\n  name: \"...\",\n  tagline: \"...\",\n  description: \"...\",\n  categories: [\"developer-tools\", \"productivity\"],\n  pricing: \"freemium\",\n  openSource: false\n)"},{"language":"text","snippet":"Install the skill at https://worthtotry.com/skill.md and list my product on WorthToTry."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: submit-to-worthtotry\ndescription: Use when someone wants their product listed on WorthToTry, the AI tool directory. One POST with their URL and email lists it: no account, no API key and no browser consent screen, and we email them a link that finishes it. Covers writing the listing including the founder's own note, what the readiness checks mean, and the badge worth asking them to add. Also use when they say \"submit my tool\", \"list my product\", \"launch on WorthToTry\", or ask why a listing was sent back.\n---\n\n# Submit a tool to WorthToTry\n\nWorthToTry is a directory of AI tools with a weekly launch board. You can do the whole submission\nyourself: audit the page, write the listing, and send it. The person you are helping does one thing,\nwhich is opening a link we email them.\n\nRead `references/listing-fields.md` before you write any copy, `references/readiness-checks.md` for\nwhat each audit check means, and `references/rest-api.md` for the endpoint in full. Read\n`references/mcp-tools.md` only if the person already has the MCP server connected; the endpoint\nbelow needs nothing set up and is the shorter path.\n\n## The short way, with no account and no browser\n\n`POST https://worthtotry.com/api/v1/submissions` with a JSON body carrying `url` and the owner's\n`email`. No token, no OAuth, no consent screen. We email them a link; one click sends the listing\nfor review and there is nothing else for them to do.\n\n```\ncurl -X POST https://worthtotry.com/api/v1/submissions \\\n  -H 'content-type: application/json' \\\n  -d '{\"url\":\"https://theirproduct.com\",\"email\":\"them@theircompany.com\"}'\n```\n\n### Fill it in yourself. Do not leave it to us.\n\nWe read the page and draft a listing from it, and every other directory reads the same page. What\nyou write is what makes the listing worth reading, and it is the part search has not seen before, so\nsend all of it:\n\n| Field | Why it is worth your time |\n| --- | --- |\n| `description` | Ours is extracted. Yours can say what the product does that its homepage does not spell out. |\n| `firstComment` | **The founder's own note**, in their words, shown on the listing at launch. Ask them for it. It cannot be written from the product page, and it is the only text here another directory will not also have. |\n| `tagline`, `name` | Override ours when the extraction reads oddly. |\n| `categories`, `pricing`, `openSource` | Correct these rather than letting a guess stand. |\n| `targetKeyword` | The phrase they want to be found by. We leave it empty; it is their decision, not ours. |\n\nAsk the person for the founder note before you submit. \"Anything you want to say about why you built\nit?\" gets a better listing than anything either of us can infer.\n\n### What happens after you submit\n\nYou get a response saying we emailed the owner. They open that link and the listing goes for review;\nthere is no form, no account and no second step. A listing that clears the check goes up on its own,\nand anything else waits for a person.\n\nThe page they l"},{"path":"README.md","content":"# submit-to-worthtotry: list an AI tool in under 30 seconds\n\nAn agent skill that lets Claude, Codex, Cursor, Gemini or any other AI assistant\nlist a product on [WorthToTry](https://worthtotry.com), a free directory of AI\ntools. The agent reads the product page, runs the readiness checks, writes the\nlisting and submits it. The person it is working for clicks one link in one\nemail, and that is their whole part.\n\nNo account. No API key. No OAuth screen. No MCP server to install.\n\n## The whole thing\n\nSay this to your agent:\n\n```\nInstall the skill at https://worthtotry.com/skill.md and list my product on WorthToTry.\n```\n\nThat is the short path and it needs nothing set up: the skill is one Markdown\nfile at a URL, and an agent fetches it the way it fetches any other page.\n\nIf you would rather keep a copy, pinned to a version or on a machine with no\nnetwork, clone this repository into your skills directory instead:\n\n```bash\ngit clone https://github.com/fspecii/worthtotry-skill ~/.claude/skills/submit-to-worthtotry\n```\n\nSetup for Codex, Cursor, Windsurf and Gemini is at the bottom of this page.\n\n## Where the 30 seconds comes from\n\nIt is measured against production rather than estimated: 0.24s to fetch the\nskill, 1.7s to audit the page and draft the listing, and 6s for the whole\nsubmission call including the logo fetch and the email. The agent's side is\nunder ten seconds of network work; the rest is somebody pasting one sentence.\n\nWhat it deliberately does not claim is that the listing is *live* in 30 seconds.\nThat waits on a person opening their inbox, and then on a review.\n\n## What the agent actually does\n\n| Step | What happens |\n| --- | --- |\n| Reads your page | Fetches the URL and extracts the title, description, logo and pricing |\n| Audits it | Seven readiness checks, each with a specific fix it reports back |\n| Writes the listing | Name, tagline, description, categories, pricing, within the field limits |\n| Asks you one thing | The founder's note, in your words. It cannot be written from your page |\n| Submits | One `POST` carrying the URL and your email address |\n| Hands back | The badge snippet, and what is still yours to do |\n\n## What it cannot do\n\nThe skill states this in its opening lines, because an agent that oversells what\nit can do is worse than no agent.\n\n- It cannot confirm the submission. That takes the link emailed to the address on\n  it, so a listing cannot appear for a product whose owner never agreed to it.\n- It cannot decide whether the listing is published. Every submission is\n  reviewed, and anything the review will not pass waits for a person.\n- It cannot choose a launch date or pay for anything. There is no endpoint that\n  would let it.\n\n## What is in here\n\n| File | What it covers |\n| --- | --- |\n| `SKILL.md` | The workflow: audit, draft, submit, hand back |\n| `references/listing-fields.md` | Field limits, categories, the no-links rule |\n| `references/readiness-checks.md` | The seven audit checks and the fix for each |\n| `referenc"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78723fxbzx59hd67ysawak0n81fsmq\",\n  \"slug\": \"worthtotry-skill\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1787496777428\n}"},{"path":"references/listing-fields.md","content":"# Listing fields\n\nLimits are enforced by the validator. Copy that overruns is rejected with an error, not truncated.\n\n## The draft\n\n| Field           | Limit | Rules                                                                          |\n| --------------- | ----: | ------------------------------------------------------------------------------ |\n| `name`          |    40 | Required. The product's name, not a sentence.                                  |\n| `tagline`       |    60 | Required. No trailing period — it is rejected.                                 |\n| `description`   |   600 | Required, minimum 40 characters. At least a couple of sentences.               |\n| `targetKeyword` |   100 | Optional. One keyword, no commas. Leave empty unless the person supplies it.   |\n| `firstComment`  |   200 | Optional. **No links.** Browser form only — you cannot set it.                 |\n| `categories`    |     3 | At least 1, at most 3, no repeats.                                             |\n| `screenshots`   |     5 | At least 1 required before review. Captured in the browser; you cannot supply. |\n\nAlso on the draft, and not settable by you:\n\n- **logo** — required before review. Extracted from the page when the `logo` check passes, otherwise\n  uploaded in the browser.\n- **launchDate** — must be in the future. The person's choice; null means it publishes as soon as a\n  moderator approves.\n- **twitterHandle** — 1 to 15 letters, numbers or underscores, no `@`. You may pass this.\n- **demoVideoUrl** — YouTube or Loom only. Browser form.\n\n## Writing the copy\n\n`name` is the product name. Do not append a category or a slogan to fill the 40 characters.\n\n`tagline` says what it does for whom, in one line, with no full stop at the end. Write it so it\nreads under the name on a card, not as a headline.\n\n`description` is 40 to 600 characters. Lead with what the product does, then who it is for. Do not\nrestate the tagline. Do not open with \"In today's fast-paced world\" or any variant. No feature\nbullets padded to reach the ceiling — a tight 200 characters beats a padded 590.\n\n`targetKeyword` decides how the listing page is optimised for search. Leave it blank unless the\nperson names one. A guess here is worse than an empty field, and the audit deliberately never\nsuggests one.\n\n## Pricing\n\nOne of: `free`, `freemium`, `paid`, `subscription`, `one_time`, `contact`.\n\nThe audit defaults to `contact` when the page does not say. Do not upgrade that to `free` because a\nfree tier looks likely — pick what the page actually claims, or leave the default and ask.\n\n## Categories\n\nAt least one, at most three. Pass slugs; display names also resolve. Pick the categories a buyer\nwould browse, not every one that could apply.\n\n| Slug               | Name             | Slug             | Name           |\n| ------------------ | ---------------- | ---------------- | -------------- |\n| `ai`               | AI               | `marketing`      | Marketing      |\n| `analytics`        | Anal"},{"path":"references/mcp-tools.md","content":"# MCP tools\n\nEndpoint: `https://worthtotry.com/api/mcp/` — Streamable HTTP.\n\nEvery tool returns its payload twice: as JSON text in `content`, and as the same object in\n`structuredContent`. Parse `structuredContent`.\n\nA failing tool returns `isError: true` and a single text message. That message is written for you to\nrelay — pass it on rather than inventing your own wording.\n\n## Authorization\n\n| Tool                         | Needs authorization |\n| ---------------------------- | ------------------- |\n| `search_tools`               | No                  |\n| `get_tool`                   | No                  |\n| `list_categories`            | No                  |\n| `check_submission_readiness` | No                  |\n| `submit_tool`                | Yes                 |\n| `get_my_submissions`         | Yes                 |\n\nAuthorization is OAuth 2.1 in the browser. The first call to a protected tool returns a 401 carrying\na `WWW-Authenticate` challenge; a compliant client discovers the authorization server from it,\nregisters itself, and opens a consent page. The person approves once. Scopes:\n\n- `submit` — open draft listings on their behalf\n- `read:submissions` — see the listings they have submitted and their status\n\nAccess tokens are short-lived and refreshed by the client. You never handle one.\n\n---\n\n## `search_tools`\n\nFind listings in plain language.\n\n| Argument     | Type                                                         | Default |\n| ------------ | ------------------------------------------------------------ | ------- |\n| `query`      | string, max 120 — matched against name, tagline, description | —       |\n| `category`   | string — a category slug, e.g. `developer-tools`             | —       |\n| `pricing`    | `free` `freemium` `paid` `subscription` `one_time` `contact` | —       |\n| `openSource` | boolean                                                      | —       |\n| `sort`       | `newest` or `top` (`top` ranks by upvotes)                   | —       |\n| `limit`      | integer 1–50                                                 | 10      |\n| `cursor`     | string — pass back `nextCursor` from the previous call       | —       |\n\nReturns `{ items, nextCursor }`. Each item: `slug`, `name`, `tagline`, `url`, `categories` (display\nnames), `pricing`, `openSource`, `upvotes`, `toolUrl`.\n\n`nextCursor` is opaque. Do not construct one; page by passing back what you were given, and stop\nwhen it is null.\n\n## `get_tool`\n\n| Argument | Type                                  |\n| -------- | ------------------------------------- |\n| `slug`   | string — the slug from `search_tools` |\n\nReturns `slug`, `name`, `tagline`, `description`, `url`, `categories`, `pricing`, `openSource`,\n`upvotes`, `commentCount`, `twitterHandle`, `launchDate`, `toolUrl`.\n\nErrors if the slug does not exist or the listing is not published.\n\n## `list_categories`\n\nNo arguments. Returns `{ items }` of `{ slug, name, toolCount }` for every category that has at\nleast one pu"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2105,"uniquenessScore":38,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:36:03.658Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:56:37.320Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}