{"serverId":"mcp-registry/com.curlship/directory","tools":[{"name":"change_listing_url","fixed":{"name":"change_listing_url","description":"Point an existing listing at a new URL. One listing per root domain, so this is how a second page replaces the first.","inputSchema":{"type":"object","required":["listing_id","url","proof"],"properties":{"url":{"type":"string"},"proof":{"enum":["email","domain"],"type":"string"},"listing_id":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":100,"tokensAfter":100},{"name":"get_daily_stats","fixed":{"name":"get_daily_stats","description":"Active listings added per UTC day — the zero-filled series behind the public /stats page. One entry per calendar day from the first listing to today, each with added and the cumulative running total.","inputSchema":{"type":"object","properties":{"range":{"type":["string","integer"],"description":"\"all\" (default) for the whole series, or a day count 1-3650 for the last N days."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":119,"tokensAfter":119},{"name":"get_dr_history","fixed":{"name":"get_dr_history","description":"The site's Ahrefs Domain Rating over time — the series behind /stats#dr. Every recorded reading, one per UTC day, plus the current value, the last step (change vs the most recent different reading) and the growth since the first reading.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":91,"tokensAfter":91},{"name":"get_stats","fixed":{"name":"get_stats","description":"Listing counts and the Ahrefs Domain Rating.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":36,"tokensAfter":36},{"name":"list_categories","fixed":{"name":"list_categories","description":"The category tree with a listing count per category — a group slug like developer-tools, plus any promoted leaf categories under it. Each listing's category field carries one of these slugs.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":79,"tokensAfter":79},{"name":"list_listings","fixed":{"name":"list_listings","description":"Active listings as JSON. No query returns every listing, in the same order as before. Optional query parameters: limit, offset, q, since, and category. q matches the title, description, or URL. since is an ISO timestamp; listings created at or after it are kept. category is a slug from list_categories and filters to that group or leaf. Each listing includes created_at and a category object ({slug, name, group}) or null while the listing is unclassified.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Substring of the title, description, or URL."},"limit":{"type":"integer","minimum":0,"description":"Max listings. 50 with offset, 100 with q, when omitted."},"since":{"type":"string","description":"ISO timestamp. Keep listings created at or after this moment."},"offset":{"type":"integer","minimum":0,"description":"How many matching listings to skip."},"category":{"type":"string","description":"A category slug from list_categories — a group or a promoted leaf."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":291,"tokensAfter":291},{"name":"read_featured","fixed":{"name":"read_featured","description":"Who holds the Featured spot, and the current minimum bid.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":41,"tokensAfter":41},{"name":"refresh_listing","fixed":{"name":"refresh_listing","description":"Re-read title, description, and image from the listed page. Send listing_id and proof only. The first confirm previews; send apply back to save.","inputSchema":{"type":"object","required":["listing_id","proof"],"properties":{"proof":{"enum":["email","domain"],"type":"string"},"listing_id":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":98,"tokensAfter":98},{"name":"remove_free_listing","fixed":{"name":"remove_free_listing","description":"Take a free listing off the directory. Send remove true and no url or email. A paid listing or the Featured holder is refused.","inputSchema":{"type":"object","required":["listing_id","remove","proof"],"properties":{"proof":{"enum":["email","domain"],"type":"string"},"remove":{"type":"boolean","const":true},"listing_id":{"type":"integer"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":108,"tokensAfter":108},{"name":"submit_listing","fixed":{"name":"submit_listing","description":"List a product. It goes live immediately. One listing per root domain. https://yourapp.com is the documentation placeholder and is refused.","inputSchema":{"type":"object","required":["url","email"],"properties":{"url":{"type":"string"},"tier":{"enum":["bronze","bronze_lifetime","silver","gold","platinum"],"type":"string","description":"Omit for the free tier. For the spot above every tier use bid_featured."},"email":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"upgrade_listing","fixed":{"name":"upgrade_listing","description":"Checkout URL for a paid tier on a listing that already exists. Featured is bid_featured, not this.","inputSchema":{"type":"object","required":["url","tier"],"properties":{"url":{"type":"string"},"tier":{"enum":["bronze","bronze_lifetime","silver","gold","platinum"],"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":91,"tokensAfter":91},{"name":"x402_submit_listing","fixed":{"name":"x402_submit_listing","description":"Buy bronze_lifetime ($30 USDC once, forever) or platinum ($49 USDC per prepaid year) with USDC over x402 — settled on-chain, no checkout page, no human in the loop. Call without payment_signature and the reply is a 402 whose body (also the PAYMENT-REQUIRED header, base64) is the quote; sign accepts[0] as an EIP-3009 authorization and call again with payment_signature — the tier is granted in that same call. Same URL and listing rules as submit_listing.","inputSchema":{"type":"object","required":["url","email","tier"],"properties":{"url":{"type":"string"},"tier":{"enum":["bronze_lifetime","platinum"],"type":"string","description":"The only tiers x402 sells."},"email":{"type":"string"},"payment_signature":{"type":"string","description":"The PAYMENT-SIGNATURE header value: base64 JSON x402 v2 PaymentPayload — accepts[0] from the quote, signed and echoed back as `accepted`. Omit to get the quote back as a 402."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":270,"tokensAfter":270}],"toolsChanged":12,"tokensSaved":0,"todo":[{"tool":"change_listing_url","params":["url","proof","listing_id"]},{"tool":"confirm_edit","params":["token","request_id"]},{"tool":"refresh_listing","params":["proof","listing_id"]},{"tool":"remove_free_listing","params":["proof","remove","listing_id"]},{"tool":"submit_listing","params":["url","email"]},{"tool":"upgrade_listing","params":["url","tier"]},{"tool":"verify_badge","params":["url"]},{"tool":"x402_submit_listing","params":["url","email"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}