Documentation

MCP Servers

Let AI assistants recommend your listings, and manage your directory from an AI agent

Dirstarter runs two MCP servers. MCP (Model Context Protocol) is the standard that AI assistants such as Claude, ChatGPT and Cursor use to call tools on other services.

ServerURLForSign-in
Public/mcpAssistants recommending your listings to their usersNone
Admin/api/mcpYou, managing the directory from an AI agentMCP_SECRET

Both servers turn your oRPC procedures into tools. A tool runs the procedure itself, so permissions, rate limits, emails and webhooks work exactly as they do in the admin. For the design decisions behind them and a real agent session, read how I built a custom MCP server.

Public server

The public server is always on. When someone asks an assistant for software your directory lists, the assistant can search your catalog and link to your listings.

ToolWhat it does
search_toolsFinds published tools by keyword and category, with paging
get_toolReturns one tool's full listing: description, categories, tags
list_categoriesLists every category with its tool count, to browse or filter by

Every tool only reads. Results are ordered by relevance alone. Listing tiers play no part, because the Claude and ChatGPT directories ban paid placement.

Each result has two links:

  • url is the tool's listing page on your site.
  • websiteUrl points to /go/<slug>?source=mcp. That redirect records a click_website event in Highseat with the source mcp, then sends the visitor to the tool's website.

Assistants don't report the clicks they send, so the redirect is the only way to see them.

Links from the public server skip affiliate URLs by default. To send those visits through affiliate links, set affiliateLinks in config/mcp.ts:

config/mcp.ts
export const mcpConfig = {
  affiliateLinks: true,
  // …
}

The affiliate URL then stays behind your own /go link. Each affiliate result carries a disclosure field ("Paid link: your site may earn a commission"), and the server tells the assistant to show it next to the link. Your site's own tool links use affiliate URLs either way.

Try it

Add the server to Claude Code, then ask for a tool your directory lists:

claude mcp add --transport http my-directory https://your-site.com/mcp

Claude Desktop, ChatGPT, Cursor and Grok accept the same URL as a custom connector.

Rate limits

The public server accepts up to 1,000 requests per hour from one address, and 20,000 per hour in total. Assistants such as Claude and ChatGPT call from shared address ranges, so the per-address limit is high. Change both in config/mcp.ts.

Listing it in assistant directories

People find MCP servers through each assistant's directory:

  • Claude: submit it at claude.ai/directory/manage. Claude can then suggest your server in chat when it's relevant.
  • ChatGPT: submit it as a plugin at platform.openai.com/plugins. It needs a verified identity, proof that you own the domain, test cases and a demo video.
  • Others: the official MCP Registry, Smithery, Glama and mcp.so accept remote servers. Grok, Gemini and Perplexity users add the URL themselves.

Each directory asks for a privacy policy that covers MCP tool calls, a documentation page, a support contact and an icon.

Anthropic and OpenAI both ban ads and paid placement. Neither policy mentions affiliate links, so ask before you submit a server with affiliateLinks on. Keep featured and sponsored ordering out of the public tools.

Admin server

The admin server lets an AI agent manage your content: add a tool from a URL, fill in its copy and media, schedule it, tidy categories and tags, or draft blog posts.

It stays off until you set MCP_SECRET:

.env
MCP_SECRET="" # generate with `openssl rand -hex 32`

Then connect your agent with the secret as a bearer token:

claude mcp add --transport http my-directory-admin https://your-site.com/api/mcp --header "Authorization: Bearer <MCP_SECRET>"

The agent acts as your site's first admin account, which also becomes the author of the blog posts it writes. To revoke access, change MCP_SECRET and redeploy.

GroupTools
Toolslist_tools, get_tool, create_tool, update_tool
Workflowfind_duplicate_tool, enrich_tool, schedule_tool
Taxonomylist_categories, create_category, update_category, list_tags, create_tag, update_tag
Bloglist_posts, get_post, create_post, update_post
Moderationlist_reports

A few rules keep the agent safe to run on a live site:

  • No tool deletes anything. An agent reads text that visitors and owners wrote, such as reports and submitter notes, and that text could carry hidden instructions. Deleting stays a manual action in the admin. To take a tool or post off the site, set it to Draft.
  • No surprise emails. The agent's edits send tool owners no email unless the agent asks for one.
  • New tools start as drafts. enrich_tool fills empty fields from the tool's website, and schedule_tool takes the next free publish day from config/submissions.ts.

Adding your own tools

Add meta.mcp to any oRPC procedure:

server/tools/router.ts
list: adminReads
  .meta({
    mcp: {
      name: "list_tools",
      description: "List the directory's tools, newest first. Returns `tools`, `total` and `pageCount`.",
      annotations: { readOnlyHint: true, openWorldHint: false },
    },
  })
  .input(toolListSchema)
  .handler(async ({ input }) => findTools(input)),

The procedure's permission picks the server: one a guest may call goes on the public server, and any other on the admin server. A public tool must be read-only and have a title annotation. bun test checks that each server stays within 25 tools and 25 KB, which keeps it usable in clients that load every tool into context.

Last updated on

On this page

Join hundreds of directory builders

Build your directory, launch, earn

Don't waste time on Stripe subscriptions or designing a pricing section. Get started today with our battle-tested stack and built-in monetization features.

Get Lifetime Access
30-day money-back guarantee