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.
| Server | URL | For | Sign-in |
|---|---|---|---|
| Public | /mcp | Assistants recommending your listings to their users | None |
| Admin | /api/mcp | You, managing the directory from an AI agent | MCP_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.
| Tool | What it does |
|---|---|
search_tools | Finds published tools by keyword and category, with paging |
get_tool | Returns one tool's full listing: description, categories, tags |
list_categories | Lists 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.
Links and affiliate links
Each result has two links:
urlis the tool's listing page on your site.websiteUrlpoints to/go/<slug>?source=mcp. That redirect records aclick_websiteevent in Highseat with the sourcemcp, 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:
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/mcpClaude 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:
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.
| Group | Tools |
|---|---|
| Tools | list_tools, get_tool, create_tool, update_tool |
| Workflow | find_duplicate_tool, enrich_tool, schedule_tool |
| Taxonomy | list_categories, create_category, update_category, list_tags, create_tag, update_tag |
| Blog | list_posts, get_post, create_post, update_post |
| Moderation | list_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_toolfills empty fields from the tool's website, andschedule_tooltakes the next free publish day fromconfig/submissions.ts.
Adding your own tools
Add meta.mcp to any oRPC procedure:
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