Skip to main content
Glama

Server Details

Find curated AI and MCP tools in the Tulimoa directory; submit yours free with a badge or for $5.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 55 days
Last Tested
Transport
Streamable HTTP ยท MCP 2025-11-25
URL
Repository
Tulimoa/tulimoa-mcp
GitHub Stars
1
Server Listing
Tulimoa MCP Server

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct resource+action: create (submit_listing), read detail (get_listing), update (edit_listing), discovery (search_listings), and reference data (list_categories). There is no meaningful overlap, and descriptions explicitly sequence the read path (search then get) and reference (categories first).

Naming Consistency5/5

All five tools follow a strict verb_noun snake_case pattern: edit_listing, get_listing, list_categories, search_listings, submit_listing. The naming is fully predictable and readable with no convention mixing.

Tool Count5/5

Five tools is well-scoped for a directory server, cleanly covering the create/read/update/discover/reference surface without redundancy. Each tool earns its place with no filler.

Completeness4/5

The core lifecycle is largely covered: create, read, search, update, and category lookup. However, there is no delete/unpublish tool and no way to list the user's own pending submissions, which are minor but real gaps an agent would hit when managing owned listings.

Available Tools

5 tools
edit_listingEdit one of your own Tulimoa listingsAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcpNo
urlNo
nameNo
slugYesSlug of YOUR listing to edit (from submit_listing).
tagsNo
ai_usageNo40 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.
categoryNo
gdpr_dpaNo
logo_urlNoNew 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.
mcp_authNo
x_handleNo
data_regionNoWhere 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.
launch_hookNo
mcp_docs_urlNo
model_sourceNo
pricing_modelNo
certificationsNo
mcp_server_urlNo
pricing_detailNo
agent_interfacesNo
hosting_providerNo
founder_x_handlesNo
short_descriptionNo
trains_on_customer_dataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesListing id.
slugYes
statusYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the review side effect (any edit resets status to pending and the listing disappears publicly until re-approved), the auth requirement (write-scoped login), and the logo precondition. It does not state whether omitted fields are preserved (partial vs. full replace), which is the one meaningful behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the core action and key by slug, then the consequences and requirements. No filler, though the logo sentence duplicates schema text and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter mutation with low schema coverage, the description covers the important behavioral risks (review reset, auth, logo requirement) but leaves the bulk of the parameter surface unexplained. Output schema exists, so return values need not be described, which keeps this at an adequate rather than deficient level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17% across 24 parameters, so the description needs to compensate and largely does not. It restates the slug and logo_url rules already present in the schema and adds the ownership/review constraints, but says nothing about the other ~20 fields (ai_usage, category, pricing_model, etc.).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update fields of a listing you own (by slug)') and scopes it to owned listings, which cleanly separates it from submit_listing (create), get_listing (read), and search_listings. The identification key (slug) is named up front.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use: you must own the listing, you cannot change ownership or review status, and a write-scoped login is required. It does not explicitly name sibling tools as alternatives (e.g. use submit_listing for a new listing), so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_listingGet one SaaS listingAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe listing's URL slug, e.g. 'acme-crm'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
listingYesFull listing row (detail projection, see DETAIL_SELECT).

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. 'Fetch' plus the enumerated read-only payload (description, ai_usage, features, pricing, certifications, links) makes the read-only nature clear and characterizes the response. However, it says nothing about behavior on an unknown/expired slug, permissions, or rate limits, which matters for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and lookup key, then the payload contents, then the routing hint. The middle field enumeration is a bit list-heavy for a tool whose output schema already defines the payload, but nothing is truly wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-record read tool with an output schema and no annotations, the definition covers what it returns and when to call it, so an agent has enough to invoke it correctly. It omits error/miss behavior and any auth expectations, which is a modest remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'slug' parameter is already documented with format constraints and an example in the schema. The description restates the identifier as 'slug' but adds no format, casing, or resolution guidance beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch full detail of a single Tulimoa listing') and pins the lookup key ('by its slug'). It is distinguishable from the plural sibling search_listings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use after search_listings when the user wants depth on a specific tool.' That names the alternative and the condition that selects this tool. It stops short of stating when NOT to use it (e.g. for bulk retrieval), so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesList directory categoriesAInspect

List the category ids and labels used to classify Tulimoa listings. Call this first when you need a valid category value for search_listings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
categoriesYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions the output contains ids and labels and the use case, which is sufficient for a read-only list operation. Could explicitly note it is safe/idempotent but not required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with purpose then usage. No superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema provided, the description covers all needed context: why to use it and what it returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so baseline is 4. The description adds value by specifying the output contents and usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists category ids and labels for Tulimoa listings. It uses a specific verb and resource, and the sibling tools are all listing-related, so no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call first when a valid category value is needed for search_listings. This provides clear when and why to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_listingsSearch SaaS listingsAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcpNotrue = only tools that expose their own MCP server.
sortNoResult order. Default: popular.
limitNoMax results (1-50, default 20).
queryNoFree-text terms matched against the listing name and short description.
eu_onlyNotrue = only tools whose company country is in the EU.
categoryNoRestrict to one category id. Call list_categories for valid ids.
pricing_modelNoRestrict to a pricing model.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of results returned.
resultsYesLean listing rows; call get_listing(slug) for full detail.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that results are limited to approved, published listings and supports various filters. However, it does not mention default behavior (e.g., default sort or limit), pagination, or edge cases like empty queries. Some behavioral context is given but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient with three concise sentences. It front-loads the purpose, lists available filters, and ends with clear usage guidance. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose, filters, and next steps for a search tool with 7 optional parameters and an output schema. It lacks details on default behavior (covered in schema) but is otherwise complete for guiding an AI agent. Minor omission of explicit mention that all parameters are optional, but schema clarifies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for all 7 parameters, including enums. The description adds context by grouping parameters (e.g., 'topic, category, pricing, MCP support, or EU hosting') but does not provide significant additional meaning beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds SaaS tools in the Tulimoa directory by various filters (topic, category, pricing, MCP, EU hosting) and returns approved listings. It explicitly distinguishes itself from the sibling get_listing by advising to call it for full detail on a result.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states to use this tool for 'find/recommend a tool for X' requests and advises the next step of calling get_listing for details. This provides clear context and differentiation from editing, submitting, or listing categories.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_listingSubmit an AI or MCP tool to the Tulimoa directoryAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcpYestrue = this tool exposes its own MCP server.
urlYesPublic homepage URL (https).
nameYesProduct/company name (max 60 chars).
tagsNoOptional descriptive tags (max 8).
countryYesISO-3166-1 alpha-2 country code of the company, e.g. DE.
ai_usageYesRequired, 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.
categoryYesOne category id. Call list_categories for valid ids.
gdpr_dpaNoOptional: a GDPR data processing agreement (DPA) is available.
logo_urlYesRequired. 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.
mcp_authNoOnly if mcp is true: how agents connect (oauth, api). Empty = no auth.
x_handleNoOptional company X handle, e.g. @acme.
visibilityYesHow 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.
data_regionNoOptional. 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.
launch_hookNoLaunch package with welcome post: one sentence why the tool matters (max 140 chars, English).
mcp_docs_urlNoOnly if mcp is true: link to the MCP docs.
model_sourceNoOptional: which AI models (own, open-weight, provider, mixed, none).
pricing_modelYesPricing model (required): free | freemium | paid | lifetime.
x_post_opt_inNoLaunch package only: a free welcome post from @gettulimoa on X after approval. Needs launch_hook and at least one X handle.
certificationsNoOptional: soc2, iso27001, hipaa.
mcp_server_urlNoOnly if mcp is true: endpoint URL of the MCP server.
pricing_detailNoOptional price detail, e.g. 'from $10/month'.
agent_interfacesNoOptional: other ways agents can use it.
hosting_providerNoOptional hosting provider and location, e.g. 'Hetzner, Falkenstein'.
founder_x_handlesNoOptional founder X handles (max 4).
short_descriptionYesOne-line pitch (max 300 chars).
withdrawal_consentNoRequired (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.
trains_on_customer_dataNoOptional: trains on customer data (no, opt-out, yes).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesListing id.
slugYesFinal slug (may carry a conflict suffix).
statusYes
next_stepYesWhat the user has to do now.
badge_htmlNoBadge only: HTML for dark backgrounds (light) or light backgrounds (dark).
manage_urlYesDashboard page for status, badge check and payment.
visibilityYes
checkout_urlNoLaunch package only: opens the Polar checkout (Tulimoa login needed).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: the listing starts as 'pending' and is reviewed by hand, badge listings go offline if the badge is missing for 14 days, launch listings are reviewed first and auto-refunded if rejected, and withdrawal consent must be obtained before setting withdrawal_consent. It also previews the outputs (checkout_url for launch, badge HTML for badge), which is genuinely useful even alongside an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, required fields, visibility modes, consent, outputs, duplicate rule, category lookup, and auth are all front-loaded in a single dense paragraph with almost no filler. It runs long, and the visibility pricing/review details could be trimmed, but nearly every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 27-parameter, 10-required creation tool, the description covers the decisions an agent cannot infer from structured fields: auth scope, review/refund flow, consent requirement, duplicate handling, and prerequisites. With an output schema present, return-value explanation is correctly left minimal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description adds cross-field semantics the schema only states per-parameter: consent must be asked before passing withdrawal_consent, and logo_url/ai_usage are called out as mandatory. However, it only spotlights a fraction of the 27 parameters, relying on the schema for the rest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: 'Create a new listing in the Tulimoa directory ... on behalf of the authenticated user.' It implicitly distinguishes itself from edit_listing by stating that 'a website that is already listed cannot be submitted again', letting an agent separate creation from modification without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing ('Use list_categories first to pick a valid category id'), a when-not condition (already-listed websites cannot be resubmitted), prerequisites ('Requires a write-scoped Tulimoa login'), and a decision rule between the two visibility modes with their cost and review behavior. Little is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Changededit_listing15 fields changed
      • addedInput schema / properties / agent_interfaces
        Added value: +{
        +  "items": {
        +    "enum": [
        +      "api",
        +      "cli",
        +      "sdk",
        +      "webhooks"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / ai_usage
        Added value: +{
        +  "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.",
        +  "maxLength": 600,
        +  "minLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / certifications
        Added value: +{
        +  "items": {
        +    "enum": [
        +      "soc2",
        +      "iso27001",
        +      "hipaa"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
      • addedInput schema / properties / data_region
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "eu",
        +    "eu-option",
        +    "non-eu",
        +    "self-hosted"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / founder_x_handles
        Added value: +{
        +  "items": {
        +    "maxLength": 40,
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / gdpr_dpa
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / hosting_provider
        Added value: +{
        +  "maxLength": 60,
        +  "type": "string"
        +}
      • addedInput schema / properties / launch_hook
        Added value: +{
        +  "maxLength": 140,
        +  "type": "string"
        +}
      • addedInput schema / properties / mcp_auth
        Added value: +{
        +  "items": {
        +    "enum": [
        +      "oauth",
        +      "api"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 2,
        +  "type": "array"
        +}
      • addedInput schema / properties / mcp_docs_url
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcp_server_url
        Added value: +{
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / model_source
        Added value: +{
        +  "enum": [
        +    "own",
        +    "open-weight",
        +    "provider",
        +    "mixed",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / pricing_detail
        Added value: +{
        +  "maxLength": 400,
        +  "type": "string"
        +}
      • addedInput schema / properties / trains_on_customer_data
        Added value: +{
        +  "enum": [
        +    "no",
        +    "opt-out",
        +    "yes"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / x_handle
        Added value: +{
        +  "maxLength": 40,
        +  "type": "string"
        +}
    • Changedsubmit_listing25 fields changed
      • addedInput schema / properties / agent_interfaces
        Added value: +{
        +  "description": "Optional: other ways agents can use it.",
        +  "items": {
        +    "enum": [
        +      "api",
        +      "cli",
        +      "sdk",
        +      "webhooks"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / ai_usage
        Added value: +{
        +  "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.",
        +  "maxLength": 600,
        +  "minLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / certifications
        Added value: +{
        +  "description": "Optional: soc2, iso27001, hipaa.",
        +  "items": {
        +    "enum": [
        +      "soc2",
        +      "iso27001",
        +      "hipaa"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
      • addedInput schema / properties / data_region
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "eu",
        +    "eu-option",
        +    "non-eu",
        +    "self-hosted"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / founder_x_handles
        Added value: +{
        +  "description": "Optional founder X handles (max 4).",
        +  "items": {
        +    "maxLength": 40,
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / gdpr_dpa
        Added value: +{
        +  "description": "Optional: a GDPR data processing agreement (DPA) is available.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / hosting_provider
        Added value: +{
        +  "description": "Optional hosting provider and location, e.g. 'Hetzner, Falkenstein'.",
        +  "maxLength": 60,
        +  "type": "string"
        +}
      • addedInput schema / properties / launch_hook
        Added value: +{
        +  "description": "Launch package with welcome post: one sentence why the tool matters (max 140 chars, English).",
        +  "maxLength": 140,
        +  "type": "string"
        +}
      • addedInput schema / properties / mcp_auth
        Added value: +{
        +  "description": "Only if mcp is true: how agents connect (oauth, api). Empty = no auth.",
        +  "items": {
        +    "enum": [
        +      "oauth",
        +      "api"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 2,
        +  "type": "array"
        +}
      • addedInput schema / properties / mcp_docs_url
        Added value: +{
        +  "description": "Only if mcp is true: link to the MCP docs.",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcp_server_url
        Added value: +{
        +  "description": "Only if mcp is true: endpoint URL of the MCP server.",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedInput schema / properties / model_source
        Added value: +{
        +  "description": "Optional: which AI models (own, open-weight, provider, mixed, none).",
        +  "enum": [
        +    "own",
        +    "open-weight",
        +    "provider",
        +    "mixed",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / pricing_detail
        Added value: +{
        +  "description": "Optional price detail, e.g. 'from $10/month'.",
        +  "maxLength": 400,
        +  "type": "string"
        +}
      • addedInput schema / properties / trains_on_customer_data
        Added value: +{
        +  "description": "Optional: trains on customer data (no, opt-out, yes).",
        +  "enum": [
        +    "no",
        +    "opt-out",
        +    "yes"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / visibility
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "badge",
        +    "launch"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / withdrawal_consent
        Added value: +{
        +  "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"
        +}
      • addedInput schema / properties / x_handle
        Added value: +{
        +  "description": "Optional company X handle, e.g. @acme.",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / x_post_opt_in
        Added value: +{
        +  "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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "short_description",
        -  "country",
        -  "category",
        -  "mcp",
        -  "pricing_model",
        -  "logo_url"
        -]New value: +[
        +  "name",
        +  "url",
        +  "short_description",
        +  "country",
        +  "category",
        +  "mcp",
        +  "pricing_model",
        +  "logo_url",
        +  "ai_usage",
        +  "visibility"
        +]
      • addedOutput schema / properties / badge_html
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Badge only: HTML for dark backgrounds (light) or light backgrounds (dark).",
        +  "properties": {
        +    "dark": {
        +      "type": "string"
        +    },
        +    "light": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "light",
        +    "dark"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / checkout_url
        Added value: +{
        +  "description": "Launch package only: opens the Polar checkout (Tulimoa login needed).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / manage_url
        Added value: +{
        +  "description": "Dashboard page for status, badge check and payment.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "description": "What the user has to do now.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / visibility
        Added value: +{
        +  "enum": [
        +    "badge",
        +    "launch"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "slug",
        -  "status"
        -]New value: +[
        +  "id",
        +  "slug",
        +  "status",
        +  "visibility",
        +  "next_step",
        +  "manage_url"
        +]
  2. 2 tool updates
    • Changededit_listing1 field changed
      • addedInput schema / properties / logo_url
        Added value: +{
        +  "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.",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedsubmit_listing2 fields changed
      • addedInput schema / properties / logo_url
        Added value: +{
        +  "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.",
        +  "format": "uri",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "short_description",
        -  "country",
        -  "category",
        -  "mcp",
        -  "pricing_model"
        -]New value: +[
        +  "name",
        +  "url",
        +  "short_description",
        +  "country",
        +  "category",
        +  "mcp",
        +  "pricing_model",
        +  "logo_url"
        +]
  3. 5 tool updates
    • Changededit_listing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "description": "Listing id.",
        +      "type": "string"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "pending",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "slug",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedget_listing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "listing": {
        +      "additionalProperties": {},
        +      "description": "Full listing row (detail projection, see DETAIL_SELECT).",
        +      "properties": {
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "listing"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_categories2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "categories": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "label": {
        +            "type": "string"
        +          },
        +          "labelDe": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "label",
        +          "labelDe"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "categories"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_listings2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "count": {
        +      "description": "Number of results returned.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "results": {
        +      "description": "Lean listing rows; call get_listing(slug) for full detail.",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "category": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "country": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "mcp": {
        +            "anyOf": [
        +              {
        +                "type": "boolean"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "pricing_model": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "short_description": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "slug",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedsubmit_listing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "description": "Listing id.",
        +      "type": "string"
        +    },
        +    "slug": {
        +      "description": "Final slug (may carry a conflict suffix).",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "pending",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "slug",
        +    "status"
        +  ],
        +  "type": "object"
        +}
  4. 3 tool updates
    • Changededit_listing1 field changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "sales-crm",
        -  "marketing",
        -  "communication",
        -  "productivity",
        -  "developer-tools",
        -  "finance-ops",
        -  "hr-people",
        -  "customer-support",
        -  "data-analytics",
        -  "ai-infra",
        -  "compliance-hosting"
        -]New value: +[
        +  "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"
        +]
    • Changedsearch_listings1 field changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "sales-crm",
        -  "marketing",
        -  "communication",
        -  "productivity",
        -  "developer-tools",
        -  "finance-ops",
        -  "hr-people",
        -  "customer-support",
        -  "data-analytics",
        -  "ai-infra",
        -  "compliance-hosting"
        -]New value: +[
        +  "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"
        +]
    • Changedsubmit_listing3 fields changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "sales-crm",
        -  "marketing",
        -  "communication",
        -  "productivity",
        -  "developer-tools",
        -  "finance-ops",
        -  "hr-people",
        -  "customer-support",
        -  "data-analytics",
        -  "ai-infra",
        -  "compliance-hosting"
        -]New value: +[
        +  "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"
        +]
      • changedInput schema / properties / pricing_model / description
        Previous value: -"Optional: free | freemium | paid | lifetime."New value: +"Pricing model (required): free | freemium | paid | lifetime."
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "short_description",
        -  "country",
        -  "category",
        -  "mcp"
        -]New value: +[
        +  "name",
        +  "url",
        +  "short_description",
        +  "country",
        +  "category",
        +  "mcp",
        +  "pricing_model"
        +]
  5. 2 tool updates
    • Addededit_listing
    • Addedsubmit_listing
  6. 3 tool updates
    • First observedget_listing
    • First observedlist_categories
    • First observedsearch_listings

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.