MCP Server

Tulimoa

com.tulimoa/platform
Search & Research Public & reachable MCP 2025-11-25

What this MCP does

Provides a directory for discovering, inspecting, submitting, and editing SaaS and AI-agent tool listings.

edit_listing
Edit one of your own Tulimoa listings
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', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'mcp': {'type': 'boolean'}, 'url': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'slug': {'type': 'string', 'minLength': 1, 'description': 'Slug of YOUR listing to edit (from submit_listing).'}, 'tags': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40, 'minLength': 1}, 'maxItems': 8}, 'category': {'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'], 'type': 'string'}, 'logo_url': {'type': 'string', 'format': 'uri', '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.'}, 'pricing_model': {'enum': ['free', 'freemium', 'paid', 'lifetime'], 'type': 'string'}, 'short_description': {'type': 'string', 'maxLength': 300, 'minLength': 1}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['id', 'slug', 'status'], 'properties': {'id': {'type': 'string', 'description': 'Listing id.'}, 'slug': {'type': 'string'}, 'status': {'type': 'string', 'const': 'pending'}}, 'additionalProperties': False}
get_listing
Get one SaaS listing
Fetch full detail of a single Tulimoa listing by its slug: long description, features, use cases, integrations, pricing detail, and links. Use after search_listings when the user wants depth on a specific tool.
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': "The listing's URL slug, e.g. 'acme-crm'."}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['listing'], 'properties': {'listing': {'type': 'object', 'required': ['slug', 'name'], 'properties': {'name': {'type': 'string'}, 'slug': {'type': 'string'}}, 'description': 'Full listing row (detail projection, see DETAIL_SELECT).', 'additionalProperties': {}}}, 'additionalProperties': False}
list_categories
List directory 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', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['categories'], 'properties': {'categories': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'label', 'labelDe'], 'properties': {'id': {'type': 'string'}, 'label': {'type': 'string'}, 'labelDe': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
search_listings
Search SaaS listings
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', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mcp': {'type': 'boolean', 'description': 'true = only tools that expose their own MCP server.'}, 'sort': {'enum': ['new', 'popular', 'viewed'], 'type': 'string', 'description': 'Result order. Default: popular.'}, 'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Max results (1-50, default 20).'}, 'query': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Free-text terms matched against the listing name and short description.'}, 'eu_only': {'type': 'boolean', 'description': 'true = only tools whose company country is in the EU.'}, 'category': {'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'], 'type': 'string', 'description': 'Restrict to one category id. Call list_categories for valid ids.'}, 'pricing_model': {'enum': ['free', 'freemium', 'paid', 'lifetime'], 'type': 'string', 'description': 'Restrict to a pricing model.'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['count', 'results'], 'properties': {'count': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of results returned.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name'], 'properties': {'mcp': {'anyOf': [{'type': 'boolean'}, {'type': 'null'}]}, 'url': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'name': {'type': 'string'}, 'slug': {'type': 'string'}, 'country': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'pricing_model': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'short_description': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'additionalProperties': {}}, 'description': 'Lean listing rows; call get_listing(slug) for full detail.'}}, 'additionalProperties': False}
submit_listing
Submit a SaaS listing to the Tulimoa directory
Create a new listing in the Tulimoa directory on behalf of the authenticated user. The listing is created with status 'pending' and appears publicly only after admin review. Every listing needs a logo: pass logo_url (a public image URL, e.g. the company's square icon). Requires a write-scoped Tulimoa login. Use list_categories first to pick a valid category id.
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'url', 'short_description', 'country', 'category', 'mcp', 'pricing_model', 'logo_url'], 'properties': {'mcp': {'type': 'boolean', 'description': 'true = this tool exposes its own MCP server.'}, 'url': {'type': 'string', 'format': 'uri', 'description': 'Public homepage URL (https).'}, 'name': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Product/company name (max 60 chars).'}, 'tags': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40, 'minLength': 1}, 'maxItems': 8, 'description': 'Optional descriptive tags (max 8).'}, 'country': {'type': 'string', 'pattern': '^[A-Z]{2}$', 'description': 'ISO-3166-1 alpha-2 country code of the company, e.g. DE.'}, 'category': {'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'], 'type': 'string', 'description': 'One category id. Call list_categories for valid ids.'}, '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.'}, 'pricing_model': {'enum': ['free', 'freemium', 'paid', 'lifetime'], 'type': 'string', 'description': 'Pricing model (required): free | freemium | paid | lifetime.'}, 'short_description': {'type': 'string', 'maxLength': 300, 'minLength': 1, 'description': 'One-line pitch (max 300 chars).'}}}
Output schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['id', 'slug', 'status'], 'properties': {'id': {'type': 'string', 'description': 'Listing id.'}, 'slug': {'type': 'string', 'description': 'Final slug (may carry a conflict suffix).'}, 'status': {'type': 'string', 'const': 'pending'}}, 'additionalProperties': False}
Added
edit_listing
Sept. 17, 2026, 12:38 p.m.
Added
submit_listing
Sept. 17, 2026, 12:38 p.m.
Added
list_categories
Sept. 17, 2026, 12:38 p.m.
Added
get_listing
Sept. 17, 2026, 12:38 p.m.
Added
search_listings
Sept. 17, 2026, 12:38 p.m.