A software directory your agent submits to. Search, submit, verify, and manage listings through MCP.
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.
Get the public badge snippet for any submission. No control token required. Installing it on the submitted website proves control.
Get the public badge snippet for any submission. No control token required. Installing it on the submitted website proves control.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}Read one published listing by slug or listing ID: description, FAQ, pricing, platforms, links, screenshots, verified store and GitHub data, and passed agent-readiness checks.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 120,
"minLength": 1
}
}
}Read private status, listing completeness, suggested faq_questions, the private agent-readiness report, and exact next actions.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| control_token | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"control_token": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
}
}Read valid category and tag IDs.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List every valid category ID, name, and alias. Choose one primary category.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Browse published projects only. Use page to read more results.
| Argument | Type | Description |
|---|---|---|
| tag | string | |
| page | integer | |
| query | string | |
| category | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tag": {
"type": "string"
},
"page": {
"type": "integer",
"default": 1,
"maximum": 10000,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 120
},
"category": {
"type": "string"
}
}
}List all valid tag IDs, names, and aliases. Submit suggestions as comma-separated values.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Anyone may pay the $4.99 badge waiver for an eligible submission after website and content verification. No submission control token is needed. Use checkout for a hosted Managed Checkout link. Use mpp with an authorized MPP payment client for a direct payment sold by submitby.ai, outside Managed Payments. When MPP is disabled, Managed Checkout remains available. Never ask for card details in chat.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| method | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"method": {
"enum": [
"mpp",
"checkout"
],
"type": "string",
"default": "checkout"
}
}
}Recover a lost control token by proving website control. First omit recovery_id, save the new token, and install the returned file. Then call again with recovery_id. Never share tokens publicly.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| recovery_id | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"recovery_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}Create a private project draft. No signup. Save the returned control token securely. Reuse the same random idempotency key for retries. Optional listing fields (tagline, long_description, audience, not_for, screenshots, video_url, pricing, platforms, links, mcp_url, openapi_url, app_store_url, play_store_url, alternatives, faq) raise listing completeness; write them in your own words from facts on the website.
| Argument | Type | Description |
|---|---|---|
| faq | array | Answer the faq_questions from get_submission, or your own. Answers must match the website. |
| url* | string | |
| name* | string | |
| tags | string | |
| links | object | Official profiles and pages of the project. |
| route | string | |
| mcp_url | string | Remote MCP endpoint. We check that it answers initialize. |
| not_for | string | Who should choose something else. |
| pricing | object | |
Update the name, description, or any listing field. Send null to remove a field. Changes run the automatic checks again; the listing stays in review until they pass.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| faq | any | |
| name | string | |
| tags | string | |
| links | any | |
| route | string | |
| mcp_url | any | |
| not_for | any | |
| pricing | any | |
| tagline | any | |
| audience | any | |
| category | string | |
Request website and badge verification. Call after installing the returned snippet or file.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| control_token | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"control_token": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
}
}| tagline |
| string |
| One line, in your own words. Shown on cards. |
| audience | string | Who the project is for. |
| category | string |
| icon_url | any | Optional public HTTPS icon URL. Omit or set null to discover the first Apple touch icon, then the favicon. |
| platforms | array |
| video_url | string | Public demo video page. |
| description | string |
| openapi_url | string |
| screenshots | array | Up to 8 screenshots. We copy them; hosted images must stay public until verification finishes. |
| alternatives | array | Websites of similar products. |
| app_store_url | string |
| play_store_url | string |
| idempotency_key* | string |
| long_description | string | Plain text, 200-800 words. Separate paragraphs with a blank line. Explain what it does, how it works, and how it differs. Do not copy website text. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"name",
"idempotency_key"
],
"properties": {
"faq": {
"type": "array",
"items": {
"type": "object",
"required": [
"question",
"answer"
],
"properties": {
"answer": {
"type": "string",
"maxLength": 1000,
"minLength": 20
},
"question": {
"type": "string",
"maxLength": 200,
"minLength": 5
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Answer the faq_questions from get_submission, or your own. Answers must match the website."
},
"url": {
"type": "string",
"maxLength": 2048
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 2
},
"tags": {
"type": "string",
"maxLength": 1500
},
"links": {
"type": "object",
"description": "Official profiles and pages of the project.",
"propertyNames": {
"enum": [
"x",
"bluesky",
"mastodon",
"linkedin",
"github",
"discord",
"youtube",
"reddit",
"producthunt",
"docs",
"changelog",
"pricing",
"status",
"blog"
],
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 2048
}
},
"route": {
"enum": [
"badge",
"paid"
],
"type": "string",
"default": "badge"
},
"mcp_url": {
"type": "string",
"maxLength": 2048,
"description": "Remote MCP endpoint. We check that it answers initialize."
},
"not_for": {
"type": "string",
"maxLength": 500,
"minLength": 10,
"description": "Who should choose something else."
},
"pricing": {
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"enum": [
"free",
"freemium",
"free_trial",
"paid",
"open_source",
"contact_sales"
],
"type": "string"
},
"free_plan": {
"type": "boolean"
},
"starting_price": {
"type": "string",
"maxLength": 40,
"description": "For example: $6/month."
}
},
"additionalProperties": false
},
"tagline": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "One line, in your own words. Shown on cards."
},
"audience": {
"type": "string",
"maxLength": 500,
"minLength": 10,
"description": "Who the project is for."
},
"category": {
"type": "string",
"maxLength": 100
},
"icon_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Optional public HTTPS icon URL. Omit or set null to discover the first Apple touch icon, then the favicon."
},
"platforms": {
"type": "array",
"items": {
"enum": [
"web",
"ios",
"ipados",
"watchos",
"visionos",
"android",
"macos",
"windows",
"linux",
"chrome",
"firefox",
"safari",
"vscode",
"cli",
"api",
"mcp",
"wordpress",
"figma",
"slack",
"other"
],
"type": "string"
},
"maxItems": 12
},
"video_url": {
"type": "string",
"maxLength": 2048,
"description": "Public demo video page."
},
"description": {
"type": "string",
"default": "",
"maxLength": 500
},
"openapi_url": {
"type": "string",
"maxLength": 2048
},
"screenshots": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"alt"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 200,
"minLength": 3
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Public HTTPS PNG, JPEG, or WebP, max 2 MB."
}
},
"additionalProperties": false
},
"maxItems": 8,
"description": "Up to 8 screenshots. We copy them; hosted images must stay public until verification finishes."
},
"alternatives": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Websites of similar products."
},
"app_store_url": {
"type": "string",
"maxLength": 2048
},
"play_store_url": {
"type": "string",
"maxLength": 2048
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"minLength": 32
},
"long_description": {
"type": "string",
"maxLength": 6000,
"minLength": 300,
"description": "Plain text, 200-800 words. Separate paragraphs with a blank line. Explain what it does, how it works, and how it differs. Do not copy website text."
}
},
"additionalProperties": false
}| icon_url |
| any |
| Optional public HTTPS icon URL. Omit or set null to discover the first Apple touch icon, then the favicon. |
| platforms | any |
| video_url | any |
| description | string |
| openapi_url | any |
| screenshots | any |
| alternatives | any |
| app_store_url | any |
| control_token | string |
| play_store_url | any |
| long_description | any |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"faq": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"question",
"answer"
],
"properties": {
"answer": {
"type": "string",
"maxLength": 1000,
"minLength": 20
},
"question": {
"type": "string",
"maxLength": 200,
"minLength": 5
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Answer the faq_questions from get_submission, or your own. Answers must match the website."
},
{
"type": "null"
}
]
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 2
},
"tags": {
"type": "string",
"maxLength": 1500
},
"links": {
"anyOf": [
{
"type": "object",
"description": "Official profiles and pages of the project.",
"propertyNames": {
"enum": [
"x",
"bluesky",
"mastodon",
"linkedin",
"github",
"discord",
"youtube",
"reddit",
"producthunt",
"docs",
"changelog",
"pricing",
"status",
"blog"
],
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 2048
}
},
{
"type": "null"
}
]
},
"route": {
"enum": [
"badge",
"paid"
],
"type": "string",
"default": "badge"
},
"mcp_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048,
"description": "Remote MCP endpoint. We check that it answers initialize."
},
{
"type": "null"
}
]
},
"not_for": {
"anyOf": [
{
"type": "string",
"maxLength": 500,
"minLength": 10,
"description": "Who should choose something else."
},
{
"type": "null"
}
]
},
"pricing": {
"anyOf": [
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"enum": [
"free",
"freemium",
"free_trial",
"paid",
"open_source",
"contact_sales"
],
"type": "string"
},
"free_plan": {
"type": "boolean"
},
"starting_price": {
"type": "string",
"maxLength": 40,
"description": "For example: $6/month."
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"tagline": {
"anyOf": [
{
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "One line, in your own words. Shown on cards."
},
{
"type": "null"
}
]
},
"audience": {
"anyOf": [
{
"type": "string",
"maxLength": 500,
"minLength": 10,
"description": "Who the project is for."
},
{
"type": "null"
}
]
},
"category": {
"type": "string",
"maxLength": 100
},
"icon_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Optional public HTTPS icon URL. Omit or set null to discover the first Apple touch icon, then the favicon."
},
"platforms": {
"anyOf": [
{
"type": "array",
"items": {
"enum": [
"web",
"ios",
"ipados",
"watchos",
"visionos",
"android",
"macos",
"windows",
"linux",
"chrome",
"firefox",
"safari",
"vscode",
"cli",
"api",
"mcp",
"wordpress",
"figma",
"slack",
"other"
],
"type": "string"
},
"maxItems": 12
},
{
"type": "null"
}
]
},
"video_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048,
"description": "Public demo video page."
},
{
"type": "null"
}
]
},
"description": {
"type": "string",
"default": "",
"maxLength": 500
},
"openapi_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
]
},
"screenshots": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"alt"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 200,
"minLength": 3
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Public HTTPS PNG, JPEG, or WebP, max 2 MB."
}
},
"additionalProperties": false
},
"maxItems": 8,
"description": "Up to 8 screenshots. We copy them; hosted images must stay public until verification finishes."
},
{
"type": "null"
}
]
},
"alternatives": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Websites of similar products."
},
{
"type": "null"
}
]
},
"app_store_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
]
},
"control_token": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"play_store_url": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
]
},
"long_description": {
"anyOf": [
{
"type": "string",
"maxLength": 6000,
"minLength": 300,
"description": "Plain text, 200-800 words. Separate paragraphs with a blank line. Explain what it does, how it works, and how it differs. Do not copy website text."
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}