Tulimoa
Find curated AI and MCP tools in the Tulimoa directory; submit yours free with a badge or for $5.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"platform": {
"url": "https://mcp.tulimoa.com/mcp"
}
}
}Remote endpoints
https://mcp.tulimoa.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢search_listings(query, category, pricing_model, mcp, eu_only, ...)
Find SaaS tools in the Tulimoa directory that an AI agent or team can plug into. Discover tools by topic, category, pricing, MCP support, or EU hosting. Returns only approved, published listings. Use this for any 'find/recommend a tool for X' request, then call get_listing for full detail on a specific result.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "Free-text terms matched against the listing name and short description.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"category": {
"description": "Restrict to one category id. Call list_categories for valid ids.",
"type": "string",
"enum": [
"developer-tools",
"ai-infra",
"sales-crm",
"marketing",
"productivity",
"data-analytics",
"finance-accounting",
"customer-support",
"hr-recruiting",
"design-creative",
"security-privacy",
"communication",
"commerce-payments",
"automation-nocode",
"other"
]
},
"pricing_model": {
"description": "Restrict to a pricing model.",
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"lifetime"
]
},
"mcp": {
"description": "true = only tools that expose their own MCP server.",
"type": "boolean"
},
"eu_only": {
"description": "true = only tools whose company country is in the EU.",
"type": "boolean"
},
"sort": {
"description": "Result order. Default: popular.",
"type": "string",
"enum": [
"new",
"popular",
"viewed"
]
},
"limit": {
"description": "Max results (1-50, default 20).",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Number of results returned."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"short_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"mcp": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pricing_model": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"slug",
"name"
],
"additionalProperties": {}
},
"description": "Lean listing rows; call get_listing(slug) for full detail."
}
},
"required": [
"count",
"results"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_listing(slug)
Fetch full detail of a single Tulimoa listing by its slug: long description, how it uses AI (ai_usage), features, use cases, integrations, pricing detail, data region and EU hosting, model source, certifications, and links. Use after search_listings when the user wants depth on a specific tool.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "The listing's URL slug, e.g. 'acme-crm'."
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"listing": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"slug",
"name"
],
"additionalProperties": {},
"description": "Full listing row (detail projection, see DETAIL_SELECT)."
}
},
"required": [
"listing"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢list_categories
List the category ids and labels used to classify Tulimoa listings. Call this first when you need a valid `category` value for search_listings.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"labelDe": {
"type": "string"
}
},
"required": [
"id",
"label",
"labelDe"
],
"additionalProperties": false
}
}
},
"required": [
"categories"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡submit_listing(name, url, short_description, country, category, ...)
Create a new listing in the Tulimoa directory (AI and MCP software with its own website) on behalf of the authenticated user. It starts as 'pending' and is reviewed by hand. Required: logo_url (a public image URL, e.g. the company's square icon) and ai_usage (how the software uses AI or what agents can do with it). Choose how it goes live with `visibility`: 'badge' (free, Tulimoa badge on the website, reviewed within 7 days) or 'launch' ($5 one-time, no badge, reviewed first, refunded if rejected). For 'launch' ask the user for consent and pass withdrawal_consent: true; the result has a checkout_url the user opens to pay. For 'badge' the result has the badge HTML to embed. A website that is already listed cannot be submitted again. Use list_categories first to pick a valid category id. Requires a write-scoped Tulimoa login.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60,
"description": "Product/company name (max 60 chars)."
},
"url": {
"type": "string",
"format": "uri",
"description": "Public homepage URL (https)."
},
"short_description": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "One-line pitch (max 300 chars)."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO-3166-1 alpha-2 country code of the company, e.g. DE."
},
"category": {
"type": "string",
"enum": [
"developer-tools",
"ai-infra",
"sales-crm",
"marketing",
"productivity",
"data-analytics",
"finance-accounting",
"customer-support",
"hr-recruiting",
"design-creative",
"security-privacy",
"communication",
"commerce-payments",
"automation-nocode",
"other"
],
"description": "One category id. Call list_categories for valid ids."
},
"mcp": {
"type": "boolean",
"description": "true = this tool exposes its own MCP server."
},
"pricing_model": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"lifetime"
],
"description": "Pricing model (required): free | freemium | paid | lifetime."
},
"logo_url": {
"type": "string",
"format": "uri",
"description": "Required. Public https URL of the company logo: PNG, JPEG, WebP, GIF or AVIF, at least 64 px, max 5 MB. A square icon works best. Tulimoa downloads it, scales it to max 512 px and stores it as WebP."
},
"ai_usage": {
"type": "string",
"minLength": 40,
"maxLength": 600,
"description": "Required, 40 to 600 characters, ideally in English: how the software uses AI, or what agents can do with it. Be concrete, not salesy. Submissions without a clear AI or agent angle are rejected."
},
"visibility": {
"type": "string",
"enum": [
"badge",
"launch"
],
"description": "How the listing goes live (required). 'badge' = free: embed the Tulimoa badge on the product website, reviewed within 7 days; if the badge is missing for 14 days the listing goes offline again. 'launch' = $5 one-time launch package: no badge needed, reviewed first, optional welcome post from @gettulimoa on X, refunded automatically if rejected. Ask the user which one they want."
},
"withdrawal_consent": {
"description": "Required (true) for visibility 'launch'. Only set it after the user agrees: Tulimoa starts the review right away, the right of withdrawal ends once the listing is live, and a rejected listing gets the $5 back automatically.",
"type": "boolean"
},
"pricing_detail": {
"description": "Optional price detail, e.g. 'from $10/month'.",
"type": "string",
"maxLength": 400
},
"mcp_server_url": {
"description": "Only if mcp is true: endpoint URL of the MCP server.",
"type": "string",
"format": "uri"
},
"mcp_docs_url": {
"description": "Only if mcp is true: link to the MCP docs.",
"type": "string",
"format": "uri"
},
"mcp_auth": {
"description": "Only if mcp is true: how agents connect (oauth, api). Empty = no auth.",
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"oauth",
"api"
]
}
},
"data_region": {
"description": "Optional. Where customer data is hosted: eu (in the EU by default), eu-option (an EU region can be selected), non-eu, self-hosted (runs at the customer). Listings with EU hosting also appear on tulimoa.com/mcp-eu.",
"type": "string",
"enum": [
"eu",
"eu-option",
"non-eu",
"self-hosted"
]
},
"hosting_provider": {
"description": "Optional hosting provider and location, e.g. 'Hetzner, Falkenstein'.",
"type": "string",
"maxLength": 60
},
"gdpr_dpa": {
"description": "Optional: a GDPR data processing agreement (DPA) is available.",
"type": "boolean"
},
"agent_interfaces": {
"description": "Optional: other ways agents can use it.",
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"api",
"cli",
"sdk",
"webhooks"
]
}
},
"model_source": {
"description": "Optional: which AI models (own, open-weight, provider, mixed, none).",
"type": "string",
"enum": [
"own",
"open-weight",
"provider",
"mixed",
"none"
]
},
"trains_on_customer_data": {
"description": "Optional: trains on customer data (no, opt-out, yes).",
"type": "string",
"enum": [
"no",
"opt-out",
"yes"
]
},
"certifications": {
"description": "Optional: soc2, iso27001, hipaa.",
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"soc2",
"iso27001",
"hipaa"
]
}
},
"x_post_opt_in": {
"description": "Launch package only: a free welcome post from @gettulimoa on X after approval. Needs launch_hook and at least one X handle.",
"type": "boolean"
},
"launch_hook": {
"description": "Launch package with welcome post: one sentence why the tool matters (max 140 chars, English).",
"type": "string",
"maxLength": 140
},
"x_handle": {
"description": "Optional company X handle, e.g. @acme.",
"type": "string",
"maxLength": 40
},
"founder_x_handles": {
"description": "Optional founder X handles (max 4).",
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
},
"tags": {
"description": "Optional descriptive tags (max 8).",
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
}
},
"required": [
"name",
"url",
"short_description",
"country",
"category",
"mcp",
"pricing_model",
"logo_url",
"ai_usage",
"visibility"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Listing id."
},
"slug": {
"type": "string",
"description": "Final slug (may carry a conflict suffix)."
},
"status": {
"type": "string",
"const": "pending"
},
"visibility": {
"type": "string",
"enum": [
"badge",
"launch"
]
},
"next_step": {
"type": "string",
"description": "What the user has to do now."
},
"manage_url": {
"type": "string",
"description": "Dashboard page for status, badge check and payment."
},
"checkout_url": {
"description": "Launch package only: opens the Polar checkout (Tulimoa login needed).",
"type": "string"
},
"badge_html": {
"description": "Badge only: HTML for dark backgrounds (light) or light backgrounds (dark).",
"type": "object",
"properties": {
"light": {
"type": "string"
},
"dark": {
"type": "string"
}
},
"required": [
"light",
"dark"
],
"additionalProperties": false
}
},
"required": [
"id",
"slug",
"status",
"visibility",
"next_step",
"manage_url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡edit_listing(slug, name, url, short_description, category, ...)
Update fields of a listing you own (by slug). You cannot change ownership or set review status. Any edit sends the listing back to admin review (status: pending) and it reappears publicly only after re-approval. Every listing needs a logo: pass logo_url to replace it (required if the listing has none yet). Requires a write-scoped Tulimoa login.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "Slug of YOUR listing to edit (from submit_listing)."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"url": {
"type": "string",
"format": "uri"
},
"short_description": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"category": {
"type": "string",
"enum": [
"developer-tools",
"ai-infra",
"sales-crm",
"marketing",
"productivity",
"data-analytics",
"finance-accounting",
"customer-support",
"hr-recruiting",
"design-creative",
"security-privacy",
"communication",
"commerce-payments",
"automation-nocode",
"other"
]
},
"mcp": {
"type": "boolean"
},
"pricing_model": {
"type": "string",
"enum": [
"free",
"freemium",
"paid",
"lifetime"
]
},
"tags": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"logo_url": {
"description": "New logo. Public https URL of the company logo: PNG, JPEG, WebP, GIF or AVIF, at least 64 px, max 5 MB. A square icon works best. Tulimoa downloads it, scales it to max 512 px and stores it as WebP. Required if the listing has no logo yet.",
"type": "string",
"format": "uri"
},
"ai_usage": {
"description": "40 to 600 characters, ideally in English: how the software uses AI, or what agents can do with it. Be concrete, not salesy. Submissions without a clear AI or agent angle are rejected.",
"type": "string",
"minLength": 40,
"maxLength": 600
},
"pricing_detail": {
"type": "string",
"maxLength": 400
},
"mcp_server_url": {
"type": "string",
"format": "uri"
},
"mcp_docs_url": {
"type": "string",
"format": "uri"
},
"mcp_auth": {
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"oauth",
"api"
]
}
},
"data_region": {
"description": "Where customer data is hosted: eu (in the EU by default), eu-option (an EU region can be selected), non-eu, self-hosted (runs at the customer). Listings with EU hosting also appear on tulimoa.com/mcp-eu.",
"type": "string",
"enum": [
"eu",
"eu-option",
"non-eu",
"self-hosted"
]
},
"hosting_provider": {
"type": "string",
"maxLength": 60
},
"gdpr_dpa": {
"type": "boolean"
},
"agent_interfaces": {
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"api",
"cli",
"sdk",
"webhooks"
]
}
},
"model_source": {
"type": "string",
"enum": [
"own",
"open-weight",
"provider",
"mixed",
"none"
]
},
"trains_on_customer_data": {
"type": "string",
"enum": [
"no",
"opt-out",
"yes"
]
},
"certifications": {
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"soc2",
"iso27001",
"hipaa"
]
}
},
"launch_hook": {
"type": "string",
"maxLength": 140
},
"x_handle": {
"type": "string",
"maxLength": 40
},
"founder_x_handles": {
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
}
},
"required": [
"slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Output Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Listing id."
},
"slug": {
"type": "string"
},
"status": {
"type": "string",
"const": "pending"
}
},
"required": [
"id",
"slug",
"status"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}Community
Evidence