Koskamo

Popdot AI MCP

An MCP server for Popdot AI that allows autonomous agents to rent verified subdomains by the hour, day, or month. It supports opening free 24-hour trials, answering safety screenings, claiming identities via Ed25519 keys, and settling payments using x402 USDC on the Base blockchain. Agents can also search inventory, price rentals, and check availability without authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Popdot AI MCP logo, by Popdot AIVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Popdot AI
MCP endpoint (Streamable HTTP)
https://popdot.ai/api/mcp
Vendor documentation

What its tools do

7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

7 of 7 have a description · 7 of 7 declare behavior hints · 7 of 7 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to popdot.ai ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Rent verified subdomains by the hour, day, or month
  • Open a free 24-hour trial to a live URL
  • Settle payments using x402 USDC on Base
  • Search inventory and price a rental

Source and maintenance

Vendor evidenceRegistry 2.0.0
Maintenance checked

Protocol and capabilities

Server
popdot-mcp 2.0.0
MCP protocol negotiated in check
2025-11-25
Tools
7 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {},
  "resources": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Start with try_domain. Your first subdomain is free for 24 hours, with no signup, key or wallet, and you do not need to search first. Call it with a one sentence goal and autoSelect: true (or a preferredSubdomain), plus the https URL of what you built if you have one. With no URL yet it goes live on a holding page you can point later. If it asks a short safety question, answer it with answer_trial_canary, and you get a live URL plus a claim token. Later, upgrade_trial turns the token into your own agent identity and, when you want to keep the URL, a paid x402 rental in USDC on Base. search_domains, get_price_quote, check_availability and rent_domain are for paid rentals.

Tools

7 advertised

try_domain
Advertised by the server during the last successful anonymous check.
Open-world

Start here. Get a memorable public URL for something you built, free for 24 hours, with no signup, key or wallet. Give a one sentence goal and set autoSelect: true (or pass preferredSubdomain); it picks the domain for you, so you do not need search_domains first. Add an https target if you have one. With no target yet the address shows a holding page, and you point it later by calling try_domain again with your trialHandle and target. It may ask a short safety question or two (answer with answer_trial_canary); on a clean pass it returns a live subdomain plus a one-time claim token you can redeem with upgrade_trial for your own agent identity. One trial per agent. Expires in 24 hours.

try_domain input schema
{
  "type": "object",
  "required": [
    "goal"
  ],
  "properties": {
    "goal": {
      "type": "string",
      "description": "What you built and want to put online, in a sentence (used to name and describe the address)."
    },
    "email": {
      "type": "string",
      "description": "Optional email to associate with the trial. Never returned."
    },
    "target": {
      "type": "string",
      "description": "Optional. An https URL to point the address at. Omit it to go live on a holding page now; to point it later, call try_domain again with the same goal, your trialHandle and this target (no answers). A trial can be pointed once."
    },
    "publicKey": {
      "type": "string",
      "description": "Optional, on the call that goes live. Your Ed25519 public key (standard padded base64 of the raw 32 bytes) to claim your agent identity in the same call. Requires headers X-Popdot-Timestamp (Unix seconds) and X-Popdot-Signature: an Ed25519 signature by this key over {timestamp}\\nPOST\\n/api/mcp\\n{sha256 hex of the raw request body}. Omit it to receive a claim token for upgrade_trial instead."
    },
    "autoSelect": {
      "type": "boolean",
      "description": "Let Popdot AI pick an available subdomain from your goal when you do not provide preferredSubdomain."
    },
    "trialHandle": {
      "type": "string",
      "description": "(retry only) The trialHandle returned by the first call. Echo it back with your answers, or with a target to point a live holding-page trial."
    },
    "desiredEmotion": {
      "enum": [
        "comedy",
        "absurd",
        "playful",
        "edgy",
        "wholesome",
        "professional",
        "trustworthy"
      ],
      "type": "string",
      "description": "Preferred vibe of the parent domain: comedy, absurd, playful, edgy, wholesome, professional, trustworthy. Unknown values are ignored."
    },
    "inputResponses": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "(retry only) Your answers to the safety questions, one { id, response } per requested input."
    },
    "analyticsConsent": {
      "type": "boolean",
      "description": "Record operator consent to trial analytics for this address."
    },
    "preferredSubdomain": {
      "type": "string",
      "description": "The subdomain label you want (e.g. 'mydemo'). Omit and set autoSelect:true to have one picked for you."
    }
  }
}
try_domain output schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "next": {
      "type": "string"
    },
    "sigil": {
      "type": "object",
      "required": [
        "sigilId",
        "publicKey",
        "mandateId"
      ],
      "properties": {
        "sigilId": {
          "type": "string"
        },
        "agentName": {
          "type": "string"
        },
        "mandateId": {
          "type": "string"
        },
        "publicKey": {
          "type": "string"
        }
      }
    },
    "domain": {
      "type": "string"
    },
    "target": {
      "type": "string"
    },
    "pointed": {
      "type": "boolean"
    },
    "sigilId": {
      "type": "string"
    },
    "trialId": {
      "type": "string"
    },
    "upgrade": {
      "type": "object",
      "properties": {
        "preserveExactUrl": {
          "type": "boolean"
        },
        "availableDurations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "agentPaymentAvailable": {
          "type": "boolean"
        }
      }
    },
    "expiresAt": {
      "type": "string"
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "question_id",
          "prompt"
        ],
        "properties": {
          "prompt": {
            "type": "string"
          },
          "question_id": {
            "type": "string"
          }
        }
      }
    },
    "subdomain": {
      "type": "string"
    },
    "claimError": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "claimToken": {
      "type": "string"
    },
    "candidateId": {
      "type": "string"
    },
    "holdingPage": {
      "type": "boolean"
    },
    "trialHandle": {
      "type": "string"
    },
    "shareMessage": {
      "type": "string"
    },
    "trustReceipt": {
      "type": "object",
      "properties": {
        "claimable": {
          "type": "boolean"
        },
        "canaryVerified": {
          "type": "boolean"
        }
      }
    },
    "canaryVerdict": {
      "type": "string"
    },
    "scorerVersion": {
      "type": "string"
    },
    "tierProgression": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "currentTier": {
          "enum": [
            "nascent",
            "fledgling",
            "established",
            "trusted",
            "sovereign"
          ],
          "type": "string"
        },
        "nextEvaluationAt": {
          "type": "string"
        },
        "evidenceConfidence": {
          "type": "number"
        }
      },
      "description": "Current enforced trust tier and when it is next evaluated. Present only once an identity exists."
    },
    "sigilEligibility": {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "eligible",
            "awaiting_key_binding",
            "active",
            "review_required",
            "denied",
            "suspended",
            "revoked"
          ],
          "type": "string"
        },
        "hardGates": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "canaryStatus": {
          "type": "string"
        }
      },
      "description": "Identity standing: lifecycle status, canary screen result, and any hard gates."
    },
    "identityConfidence": {
      "type": "object",
      "properties": {
        "level": {
          "enum": [
            "unbound",
            "key_bound",
            "sponsor_verified"
          ],
          "type": "string"
        },
        "sponsorVerified": {
          "type": "boolean"
        }
      },
      "description": "How firmly this identity is bound: unbound, bound to a key, or backed by a verified sponsor."
    },
    "claimTokenExpiresAt": {
      "type": "string"
    }
  }
}
try_domain annotations
{
  "readOnlyHint": false,
  "openWorldHint": true
}
answer_trial_canary
Advertised by the server during the last successful anonymous check.
Open-world

Answer the short safety questions for a trial opened by try_domain, then go live. Pass the trialHandle and your answers; on a clean pass this provisions a live 24-hour subdomain and returns a one-time claim token you can redeem for your own agent identity.

answer_trial_canary input schema
{
  "type": "object",
  "required": [
    "trialHandle",
    "answers"
  ],
  "properties": {
    "answers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "question_id",
          "response"
        ],
        "properties": {
          "response": {
            "type": "string"
          },
          "question_id": {
            "type": "string"
          }
        }
      },
      "description": "Your answers to the safety questions, one { question_id, response } per question."
    },
    "publicKey": {
      "type": "string",
      "description": "Optional, on the call that goes live. Your Ed25519 public key (standard padded base64 of the raw 32 bytes) to claim your agent identity in the same call. Requires headers X-Popdot-Timestamp (Unix seconds) and X-Popdot-Signature: an Ed25519 signature by this key over {timestamp}\\nPOST\\n/api/mcp\\n{sha256 hex of the raw request body}. Omit it to receive a claim token for upgrade_trial instead."
    },
    "trialHandle": {
      "type": "string",
      "description": "The trialHandle returned by try_domain."
    }
  }
}
answer_trial_canary output schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "sigil": {
      "type": "object",
      "required": [
        "sigilId",
        "publicKey",
        "mandateId"
      ],
      "properties": {
        "sigilId": {
          "type": "string"
        },
        "agentName": {
          "type": "string"
        },
        "mandateId": {
          "type": "string"
        },
        "publicKey": {
          "type": "string"
        }
      }
    },
    "reason": {
      "type": "string"
    },
    "status": {
      "type": "string"
    },
    "sigilId": {
      "type": "string"
    },
    "trialId": {
      "type": "string"
    },
    "upgrade": {
      "type": "object",
      "properties": {
        "preserveExactUrl": {
          "type": "boolean"
        },
        "availableDurations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "agentPaymentAvailable": {
          "type": "boolean"
        }
      }
    },
    "expiresAt": {
      "type": "string"
    },
    "retryable": {
      "type": "boolean"
    },
    "claimError": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "claimToken": {
      "type": "string"
    },
    "candidateId": {
      "type": "string"
    },
    "holdingPage": {
      "type": "boolean"
    },
    "shareMessage": {
      "type": "string"
    },
    "trustReceipt": {
      "type": "object",
      "properties": {
        "claimable": {
          "type": "boolean"
        },
        "canaryVerified": {
          "type": "boolean"
        }
      }
    },
    "canaryVerdict": {
      "type": "string"
    },
    "scorerVersion": {
      "type": "string"
    },
    "claimTokenExpiresAt": {
      "type": "string"
    }
  }
}
answer_trial_canary annotations
{
  "readOnlyHint": false,
  "openWorldHint": true
}
search_domains
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search domains available for paid rental on Popdot AI. Not needed for your first address: try_domain gives you one free for 24 hours and picks the domain itself. Use this to browse parent domains for a paid rental or a persistent web presence. Returns domains with pricing, tier, availability and trialEligible. No auth required.

search_domains input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Maximum number of results to return (default: 20, max: 50)"
    },
    "query": {
      "type": "string",
      "description": "Search query to match against domain names, tags, and categories"
    },
    "emotion": {
      "enum": [
        "comedy",
        "absurd",
        "playful",
        "edgy",
        "wholesome",
        "professional",
        "trustworthy"
      ],
      "type": "string",
      "description": "Filter by the reaction the domain is built to elicit: comedy, absurd, playful, edgy, wholesome, professional, trustworthy. Unknown values are ignored."
    },
    "maxPrice": {
      "type": "number",
      "description": "Maximum daily price in USD"
    },
    "minPrice": {
      "type": "number",
      "description": "Minimum daily price in USD"
    }
  }
}
search_domains output schema
{
  "type": "object",
  "required": [
    "domains"
  ],
  "properties": {
    "domains": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "tld": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "pricing": {
            "type": "object",
            "properties": {
              "daily": {
                "type": "number"
              },
              "hourly": {
                "type": "number"
              },
              "weekly": {
                "type": "number"
              },
              "monthly": {
                "type": "number"
              },
              "currency": {
                "type": "string"
              }
            }
          },
          "tierScore": {
            "type": "number"
          },
          "fullDomain": {
            "type": "string"
          },
          "emotionTags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "trialEligible": {
            "type": "boolean"
          }
        }
      }
    },
    "freeTrial": {
      "type": "object",
      "properties": {
        "note": {
          "type": "string"
        },
        "tool": {
          "type": "string"
        },
        "duration": {
          "type": "string"
        },
        "requires": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "available": {
          "type": "boolean"
        }
      }
    },
    "pagination": {
      "type": "object",
      "properties": {
        "page": {
          "type": "number"
        },
        "limit": {
          "type": "number"
        },
        "total": {
          "type": "number"
        },
        "totalPages": {
          "type": "number"
        }
      }
    }
  }
}
search_domains annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_price_quote
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get a price quote for a paid rental of a specific domain for a given duration. Returns the computed rental cost, tier info, and pricing breakdown. Your first subdomain is free for 24 hours with try_domain, so you only need a quote to pay for a longer stay.

get_price_quote input schema
{
  "type": "object",
  "required": [
    "domainId",
    "duration"
  ],
  "properties": {
    "domainId": {
      "type": "string",
      "description": "The domain to price: its id from search_domains, or its name (for example addedtocart.shop)"
    },
    "duration": {
      "enum": [
        "PT1H",
        "PT4H",
        "P1D",
        "P7D",
        "P30D"
      ],
      "type": "string",
      "description": "ISO 8601 duration: PT1H (1 hour), PT4H (4 hours), P1D (1 day), P7D (1 week), P30D (30 days)"
    }
  }
}
get_price_quote output schema
{
  "type": "object",
  "required": [
    "domainId",
    "totalCost",
    "currency"
  ],
  "properties": {
    "tier": {
      "type": "string"
    },
    "hours": {
      "type": "number"
    },
    "feeNote": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "domainId": {
      "type": "string"
    },
    "duration": {
      "type": "string"
    },
    "available": {
      "type": "boolean"
    },
    "tierScore": {
      "type": "number"
    },
    "totalCost": {
      "type": "number"
    },
    "fullDomain": {
      "type": "string"
    },
    "serviceFee": {
      "type": "number"
    },
    "ownerPayout": {
      "type": "number"
    },
    "priceSource": {
      "enum": [
        "owner",
        "algorithm"
      ],
      "type": "string"
    },
    "rentalPrice": {
      "type": "number"
    },
    "durationLabel": {
      "type": "string"
    },
    "priceBreakdown": {
      "type": "object",
      "properties": {
        "daily": {
          "type": "number"
        },
        "hourly": {
          "type": "number"
        },
        "weekly": {
          "type": "number"
        },
        "monthly": {
          "type": "number"
        }
      }
    },
    "ownerCommission": {
      "type": "number"
    },
    "ownerCommissionPercent": {
      "type": "number"
    }
  }
}
get_price_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
check_availability
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Check whether a specific subdomain is available on a given domain for a paid rental. Returns true if the subdomain can be rented. try_domain checks availability on its own, so a free trial does not need this. Tip: the subdomain and domain read as one phrase, so pick a single lowercase label that is funny or fits the domain's theme (for example iamyour.slopmommy.com or analien.lostmyluggage.com). A delightful combination is the point of a Popdot AI address.

check_availability input schema
{
  "type": "object",
  "required": [
    "domainId",
    "subdomain"
  ],
  "properties": {
    "domainId": {
      "type": "string",
      "description": "The parent domain: its id from search_domains, or its name (for example addedtocart.shop)"
    },
    "subdomain": {
      "type": "string",
      "description": "The subdomain label to check (e.g., 'myproject' for myproject.example.com)"
    }
  }
}
check_availability output schema
{
  "type": "object",
  "required": [
    "domainId",
    "subdomain",
    "available"
  ],
  "properties": {
    "reason": {
      "type": "string"
    },
    "fullUrl": {
      "type": "string"
    },
    "domainId": {
      "type": "string"
    },
    "available": {
      "type": "boolean"
    },
    "subdomain": {
      "type": "string"
    },
    "fullDomain": {
      "type": "string"
    }
  }
}
check_availability annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
rent_domain
Advertised by the server during the last successful anonymous check.
Open-world

Paid rental. For your first address, call try_domain instead: it is free for 24 hours and needs no wallet. Rent a subdomain, paying per-transaction with USDC on Base (x402). No funded account or stored balance: each rental is a single on-chain payment. Requires agent authentication. Two phases: call once with intentMandateId, domainId, subdomain, duration, and the payerAddress + payerProof for the wallet you will pay from, to get the exact x402 payment challenge; pay it on Base; then call again with paymentId, txHash, and fromAddress to settle and receive the live rental plus a Web Identity Credential. Two ways to pay are accepted: send the USDC yourself and settle with txHash, or sign the standard x402 "exact" EIP-3009 authorization for the requirement in structuredContent.accepts (any stock x402 SDK does this) and call again with paymentId and x402Payment instead of txHash; Popdot settles it through an x402 facilitator, and you pay no gas. Request an x402 payment challenge to rent a subdomain. Durations PT1H, PT4H, P1D, P7D, P30D. Returns the exact USDC amount and recipient on Base.

rent_domain input schema
{
  "type": "object",
  "required": [
    "intentMandateId",
    "domainId",
    "subdomain",
    "duration"
  ],
  "properties": {
    "txHash": {
      "type": "string",
      "description": "(phase 2) The on-chain transaction hash of your USDC payment on Base."
    },
    "domainId": {
      "type": "string",
      "description": "The unique ID of the domain to rent on"
    },
    "duration": {
      "enum": [
        "PT1H",
        "PT4H",
        "P1D",
        "P7D",
        "P30D"
      ],
      "type": "string",
      "description": "ISO 8601 duration: PT1H (1 hour), PT4H (4 hours), P1D (1 day), P7D (1 week), P30D (30 days)"
    },
    "paymentId": {
      "type": "string",
      "description": "(phase 2) The paymentId returned by the phase-1 challenge."
    },
    "subdomain": {
      "type": "string",
      "description": "The subdomain label to rent (e.g., 'myproject' for myproject.example.com)"
    },
    "payerProof": {
      "type": "string",
      "description": "(phase 1) EIP-191 personal_sign signature proving control of payerAddress. Always required with payerAddress."
    },
    "fromAddress": {
      "type": "string",
      "description": "(phase 2) The wallet you paid from (must match the challenge's bound payer)."
    },
    "x402Payment": {
      "type": [
        "string",
        "object"
      ],
      "description": "(phase 2, instead of txHash) An x402 \"exact\" payment payload signed by the bound payer for structuredContent.accepts[0]: the JSON object, or its base64 as sent in a PAYMENT-SIGNATURE or X-PAYMENT header. Send it with paymentId."
    },
    "payerAddress": {
      "type": "string",
      "description": "(phase 1) The 0x wallet you will pay from. Required on every challenge; a wallet registered on your Sigil does not substitute for it."
    },
    "intentMandateId": {
      "type": "string",
      "description": "The ID of the active Intent Mandate authorizing this purchase"
    },
    "payerProofIssuedAt": {
      "type": "string",
      "description": "(phase 1, optional) ISO 8601 timestamp of the payerProof, within 5 minutes of the request."
    }
  }
}
rent_domain output schema
{
  "type": "object",
  "properties": {
    "next": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "rental": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "endTime": {
          "type": "string"
        },
        "fullUrl": {
          "type": "string"
        },
        "startTime": {
          "type": "string"
        },
        "subdomain": {
          "type": "string"
        }
      }
    },
    "status": {
      "type": "string"
    },
    "accepts": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "asset": {
            "type": "string"
          },
          "extra": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              },
              "paymentId": {
                "type": "string"
              },
              "settleUrl": {
                "type": "string"
              },
              "assetTransferMethod": {
                "type": "string"
              }
            }
          },
          "payTo": {
            "type": "string"
          },
          "amount": {
            "type": "string"
          },
          "scheme": {
            "type": "string"
          },
          "network": {
            "type": "string"
          },
          "maxTimeoutSeconds": {
            "type": "number"
          }
        }
      }
    },
    "payment": {
      "type": "object",
      "properties": {
        "memo": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "txHash": {
          "type": "string"
        },
        "chainId": {
          "type": "number"
        },
        "protocol": {
          "type": "string"
        },
        "expiresAt": {
          "type": "string"
        },
        "paymentId": {
          "type": "string"
        },
        "recipient": {
          "type": "string"
        },
        "settleUrl": {
          "type": "string"
        },
        "tokenAddress": {
          "type": "string"
        },
        "amountInSmallestUnit": {
          "type": "string"
        }
      }
    },
    "rentalId": {
      "type": "string"
    },
    "settleUrl": {
      "type": "string"
    },
    "credential": {
      "type": "string"
    },
    "provisioning": {
      "type": "object",
      "properties": {
        "message": {
          "type": "string"
        },
        "statusUrl": {
          "type": "string"
        },
        "timeoutSeconds": {
          "type": "number"
        },
        "pollIntervalSeconds": {
          "type": "number"
        }
      }
    },
    "tierProgression": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "currentTier": {
          "enum": [
            "nascent",
            "fledgling",
            "established",
            "trusted",
            "sovereign"
          ],
          "type": "string"
        },
        "nextEvaluationAt": {
          "type": "string"
        },
        "evidenceConfidence": {
          "type": "number"
        }
      },
      "description": "Current enforced trust tier and when it is next evaluated. Present only once an identity exists."
    },
    "sigilEligibility": {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "eligible",
            "awaiting_key_binding",
            "active",
            "review_required",
            "denied",
            "suspended",
            "revoked"
          ],
          "type": "string"
        },
        "hardGates": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "canaryStatus": {
          "type": "string"
        }
      },
      "description": "Identity standing: lifecycle status, canary screen result, and any hard gates."
    },
    "identityConfidence": {
      "type": "object",
      "properties": {
        "level": {
          "enum": [
            "unbound",
            "key_bound",
            "sponsor_verified"
          ],
          "type": "string"
        },
        "sponsorVerified": {
          "type": "boolean"
        }
      },
      "description": "How firmly this identity is bound: unbound, bound to a key, or backed by a verified sponsor."
    }
  }
}
rent_domain annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
upgrade_trial
Advertised by the server during the last successful anonymous check.
Open-world

Turn a free trial into your own paid, persistent address in one call, no human required. Claim the agent identity your trial created (a Nascent Sigil, its sigilId came back when the trial went live) by proving you hold your Ed25519 key: send the one-time claimToken, the sigilId, your publicKey, a Unix timestamp and a signature by your key over popdot-claim/1\n{timestamp}\n{sigilId}\n{sha256 hex of claimToken}\n{publicKey}. The claim token works until 30 days after the trial ends. If you supply a wallet, this also returns the exact USDC-on-Base (x402) challenge to keep the trial's exact URL live on a paid rental. No wallet yet? You still get your identity; fund a USDC wallet on Base later and pay it yourself.

upgrade_trial input schema
{
  "type": "object",
  "required": [
    "claimToken",
    "sigilId",
    "publicKey",
    "timestamp",
    "signature"
  ],
  "properties": {
    "sigilId": {
      "type": "string",
      "description": "The sigilId returned with the claim token. It must match the identity the token belongs to."
    },
    "duration": {
      "type": "string",
      "description": "Optional rental length: an ISO 8601 duration (PT1H, PT4H, P1D, P7D, P30D) or hourly/daily/weekly/monthly. Defaults to PT1H (1 hour)."
    },
    "publicKey": {
      "type": "string",
      "description": "Your Ed25519 public key as standard padded base64 of the raw 32 bytes (44 characters). You keep the private key."
    },
    "signature": {
      "type": "string",
      "description": "Standard padded base64 of the 64-byte Ed25519 signature over the popdot-claim/1 message."
    },
    "timestamp": {
      "type": "string",
      "description": "Integer Unix seconds, no leading zeros, within 300 seconds of now. Part of the signed message."
    },
    "claimToken": {
      "type": "string",
      "description": "The one-time claim token returned by try_domain / answer_trial_canary."
    },
    "payerProof": {
      "type": "string",
      "description": "Optional EIP-191 personal_sign signature proving control of payerAddress."
    },
    "payerAddress": {
      "type": "string",
      "description": "Optional 0x wallet you will pay from. Provide it (with payerProof) to receive a self-pay x402 challenge."
    },
    "payerProofIssuedAt": {
      "type": "string",
      "description": "Optional ISO 8601 timestamp of the payerProof, within 5 minutes."
    }
  }
}
upgrade_trial output schema
{
  "type": "object",
  "required": [
    "sigil",
    "upgrade"
  ],
  "properties": {
    "sigil": {
      "type": "object",
      "required": [
        "sigilId",
        "publicKey",
        "mandateId"
      ],
      "properties": {
        "sigilId": {
          "type": "string"
        },
        "agentName": {
          "type": "string"
        },
        "mandateId": {
          "type": "string"
        },
        "publicKey": {
          "type": "string"
        }
      }
    },
    "upgrade": {
      "type": "object",
      "properties": {
        "fqdn": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "payment": {
          "type": "object",
          "properties": {
            "memo": {
              "type": "string"
            },
            "status": {
              "type": "string"
            },
            "txHash": {
              "type": "string"
            },
            "chainId": {
              "type": "number"
            },
            "protocol": {
              "type": "string"
            },
            "expiresAt": {
              "type": "string"
            },
            "paymentId": {
              "type": "string"
            },
            "recipient": {
              "type": "string"
            },
            "settleUrl": {
              "type": "string"
            },
            "tokenAddress": {
              "type": "string"
            },
            "amountInSmallestUnit": {
              "type": "string"
            }
          }
        },
        "duration": {
          "type": "string"
        },
        "preserveExactUrl": {
          "type": "boolean"
        }
      }
    },
    "walletGuidance": {
      "type": "string"
    },
    "tierProgression": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "currentTier": {
          "enum": [
            "nascent",
            "fledgling",
            "established",
            "trusted",
            "sovereign"
          ],
          "type": "string"
        },
        "nextEvaluationAt": {
          "type": "string"
        },
        "evidenceConfidence": {
          "type": "number"
        }
      },
      "description": "Current enforced trust tier and when it is next evaluated. Present only once an identity exists."
    },
    "sigilEligibility": {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "eligible",
            "awaiting_key_binding",
            "active",
            "review_required",
            "denied",
            "suspended",
            "revoked"
          ],
          "type": "string"
        },
        "hardGates": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "canaryStatus": {
          "type": "string"
        }
      },
      "description": "Identity standing: lifecycle status, canary screen result, and any hard gates."
    },
    "identityConfidence": {
      "type": "object",
      "properties": {
        "level": {
          "enum": [
            "unbound",
            "key_bound",
            "sponsor_verified"
          ],
          "type": "string"
        },
        "sponsorVerified": {
          "type": "boolean"
        }
      },
      "description": "How firmly this identity is bound: unbound, bound to a key, or backed by a verified sponsor."
    }
  }
}
upgrade_trial annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

Available Domains

Advertised by the server during the last successful anonymous check.

List of domains currently available for rental on the Popdot AI marketplace

Available Domains URI
popdot://domains/available

MIME type: application/json

Agent Rentals

Advertised by the server during the last successful anonymous check.

Active rentals for a specific agent (requires the agent's sigil ID)

Agent Rentals URI template
popdot://rentals/{agentId}

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1515 ms
95th percentile latency
1515 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1515 ms · metadata changed · 7 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http popdot-ai-mcp https://popdot.ai/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add popdot-ai-mcp --url https://popdot.ai/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable popdot-ai-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "popdot-ai-mcp": {
      "url": "https://popdot.ai/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "popdot-ai-mcp": {
      "type": "streamableHttp",
      "url": "https://popdot.ai/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start popdot-ai-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "popdot-ai-mcp": {
      "type": "http",
      "url": "https://popdot.ai/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http popdot-ai-mcp https://popdot.ai/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://popdot.ai/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "popdot-ai-mcp": {
      "serverUrl": "https://popdot.ai/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Popdot AI MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Popdot AI MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing