Read and submit the CurlShip directory. Paid actions return checkout_url.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Take the Featured spot. It sits above every listing. The minimum right now is $51. Always dofollow. One-time payment, no refund when someone outbids you. The product must already be listed. Omit amount_usd to bid $51.
URL of a listing that is already on the directory.
Bid in USD. Omit to bid the minimum (51).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Take the Featured spot. It sits above every listing. The minimum right now is $51. Always dofollow. One-time payment, no refund when someone outbids you. The product must already be listed. Omit amount_usd to bid $51.
| Argument | Type | Description |
|---|---|---|
| url* | string | URL of a listing that is already on the directory. |
| amount_usd | number | Bid in USD. Omit to bid the minimum (51). |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "URL of a listing that is already on the directory."
},
"amount_usd": {
"type": "number",
"description": "Bid in USD. Omit to bid the minimum (51)."
}
}
}Point an existing listing at a new URL. One listing per root domain, so this is how a second page replaces the first.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| proof* | string | |
| listing_id* | integer |
{
"type": "object",
"required": [
"listing_id",
"url",
"proof"
],
"properties": {
"url": {
"type": "string"
},
"proof": {
"enum": [
"email",
"domain"
],
"type": "string"
},
"listing_id": {
"type": "integer"
}
}
}Apply an edit request. A refresh needs a second call with the apply digest from the preview.
| Argument | Type | Description |
|---|---|---|
| apply | string | Digest from the refresh preview. Omit for a URL change or a removal. |
| token* | string | |
| request_id* | integer |
{
"type": "object",
"required": [
"request_id",
"token"
],
"properties": {
"apply": {
"type": "string",
"description": "Digest from the refresh preview. Omit for a URL change or a removal."
},
"token": {
"type": "string"
},
"request_id": {
"type": "integer"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| range | string | integer | "all" (default) for the whole series, or a day count 1-3650 for the last N days. |
{
"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."
}
}
}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.
No arguments.
{
"type": "object",
"properties": {}
}Listing counts and the Ahrefs Domain Rating.
No arguments.
{
"type": "object",
"properties": {}
}Active listings as JSON. No query returns every listing, in the same order as before. Optional query parameters: limit, offset, q, and since. q matches the title, description, or URL. since is an ISO timestamp; listings created at or after it are kept. Each listing includes created_at. There is no category or tag field.
| Argument | Type | Description |
|---|---|---|
| q | string | Substring of the title, description, or URL. |
| limit | integer | Max listings. 50 with offset, 100 with q, when omitted. |
| since | string | ISO timestamp. Keep listings created at or after this moment. |
| offset | integer | How many matching listings to skip. |
{
"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."
}
}
}Who holds the Featured spot, and the current minimum bid.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| proof* | string | |
| listing_id* | integer |
{
"type": "object",
"required": [
"listing_id",
"proof"
],
"properties": {
"proof": {
"enum": [
"email",
"domain"
],
"type": "string"
},
"listing_id": {
"type": "integer"
}
}
}Take a free listing off the directory. Send remove true and no url or email. A paid listing or the Featured holder is refused.
| Argument | Type | Description |
|---|---|---|
| proof* | string | |
| remove* | boolean | |
| listing_id* | integer |
{
"type": "object",
"required": [
"listing_id",
"remove",
"proof"
],
"properties": {
"proof": {
"enum": [
"email",
"domain"
],
"type": "string"
},
"remove": {
"type": "boolean",
"const": true
},
"listing_id": {
"type": "integer"
}
}
}List a product. It goes live immediately. One listing per root domain. https://yourapp.com is the documentation placeholder and is refused.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| tier | string | Omit for the free tier. For the spot above every tier use bid_featured. |
| email* | string |
{
"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"
}
}
}Checkout URL for a paid tier on a listing that already exists. Featured is bid_featured, not this.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| tier* | string |
{
"type": "object",
"required": [
"url",
"tier"
],
"properties": {
"url": {
"type": "string"
},
"tier": {
"enum": [
"bronze",
"bronze_lifetime",
"silver",
"gold",
"platinum"
],
"type": "string"
}
}
}Re-check the listed site for a link to curlship.com. A free listing with the badge becomes dofollow.
| Argument | Type | Description |
|---|---|---|
| url* | string |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
}
}
}Bid on the Featured spot in USDC over x402 — the same auction as bid_featured (minimum $51 right now), but settled on-chain with no checkout and no human in the loop. Call without payment_signature for the 402 quote, sign accepts[0] as an EIP-3009 authorization, call again with payment_signature echoing it as `accepted`. The product must already be listed. Omit amount_usd to bid $51.
| Argument | Type | Description |
|---|---|---|
| url* | string | URL of a listing that is already on the directory. |
| amount_usd | number | Bid in USD. Omit to bid the minimum (51). |
| payment_signature | string | 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. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "URL of a listing that is already on the directory."
},
"amount_usd": {
"type": "number",
"description": "Bid in USD. Omit to bid the minimum (51)."
},
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| tier* | string | The only tiers x402 sells. |
| email* | string | |
| payment_signature | string | 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. |
{
"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."
}
}
}