---
title: "Self-register an MCP server you operate (step one)"
method: POST
path: "/api/v1/mcp-directory/servers"
tags: ["mcp-directory"]
---

# Self-register an MCP server you operate (step one)

`POST /api/v1/mcp-directory/servers`

## Request

- Base URL: `https://koskamo.com`
- URL: `https://koskamo.com/api/v1/mcp-directory/servers`
- Auth: none declared

No account needed; requires the application's trusted ingress. Validates the fields and returns a claim token with where to publish it: https://<endpoint host>/.well-known/koskamo-claim or TXT _koskamo-claim.<domain>. Nothing is listed or queued until step two finds the proof and the live check passes. The registration expires after 7 days. Refused with 409 when the id is taken or another listing already uses the endpoint host (the response points to the claim and key-recovery flows). Rate limit: 5 requests per hour per IP. Same flow as the koskamo_register_mcp_server MCP tool. Email ownership proof: send method "email" with proofEmail at one of admin, administrator, webmaster, hostmaster, postmaster (no plus-tags) on the endpoint host or a parent domain. A single-use confirm link (expires in 48 hours) is mailed there and never returned; once a person presses Confirm, call verify with method "email". Limits: 3 mails per address per day, 5 per IP per hour; starting again sends a new link and voids the old one. A confirmed email proof lapses after 365 days.

## Request body

- object
  - `id` string, required: Page id; the listing lives at /explore/{id}
  - `name` string, required
  - `operator` string, required: Company that runs the server
  - `endpoint` string, uri, required: Streamable HTTP endpoint, https
  - `category` 'docs-reference' | 'developer-tools' | 'cloud-infrastructure' | 'data-analytics' | 'ai-ml' | 'commerce' | 'payments' | 'productivity' | 'project-management' | 'crm-marketing' | 'design', required
  - `auth` 'none' | 'oauth-optional' | 'oauth' | 'api-key', required
  - `description` string, required
  - `useCases` string[], required
  - `requirements` string[]: Optional prerequisites a user must already have (vendor account, subscription, issued key), beyond endpoint sign-in
  - `docsUrl` string, uri, required: Your documentation page for this server
  - `companyUrl` string: Optional https company website; an empty string clears it on edits
  - `tools` string[]: Replaced by the live tool list on every passing check
  - `email` string, email: Optional but recommended, so we can reach you about auto-hide, lapsed proof, or key recovery. It receives one confirmation message and nothing else until confirmed, is never shown publicly, and never grants ownership.
  - `method` 'email': Send "email" with proofEmail for an email ownership proof; omit for a token to publish
  - `proofEmail` string, email: admin|administrator|webmaster|hostmaster|postmaster@<endpoint host or parent domain>

## Response `201`

Token issued; publish it, then call the verify URL

- object
  - `registration` object, required
    - `purpose` 'register' | 'recover', required
    - `serverId` string, required
    - `token` string, required
    - `expiresAt` string, date-time, required
    - `proofs` object, required: Publish the token by either method. The well-known file must be on the endpoint's exact host; the TXT record may be on that host or a parent domain.
      - `http` object
        - `url` string, uri
        - `body` string
        - `note` string
      - `dns` object[]
        - `name` string
        - `type` 'TXT'
        - `value` string
    - `verify` object, required: The step-two request to send once the token is published (or the emailed link is confirmed)
      - `method` string
      - `url` string, uri
      - `body` object
    - `emailProof` object: Present for an email proof: where the confirm link was sent. The link's token is never returned.
      - `sentTo` string
      - `message` string
    - `nextSteps` string[], required: Plain-language steps from publishing the token to storing the owner key
    - `guide` string, uri, required
  - `contact` string, nullable

## Other responses

- `400`: Invalid fields, email, or proofEmail
- `403`: Access denied (trusted ingress required)
- `409`: Id taken, or the endpoint host belongs to another listing
- `429`: Rate limited (5 requests per hour per IP), or the ownership-email limit
- `503`: Email proof requested but mail is unavailable

---

[API](https://skmtc.dev/koskamo/apis/koskamo-agent-api.md) · [All operations](https://skmtc.dev/koskamo/apis/koskamo-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/koskamo/apis/koskamo-agent-api/revisions/c7761a377e7b?raw)
