Koskamo

Tulimoa MCP

A public MCP server operated by Tulimoa that allows AI agents to search its hand-reviewed directory of AI and MCP software tools. It enables structured discovery for agents acting on behalf of users, filtering for MCP-enabled tools and verified servers.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Tulimoa MCP logo, by TulimoaVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Tulimoa
MCP endpoint (Streamable HTTP)
https://mcp.tulimoa.com/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 0 of 5 declare behavior hints · 3 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to tulimoa.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for curated AI and MCP software tools
  • Discover tools with verified MCP servers
  • Enable structured discovery for AI agents

Source and maintenance

Vendor evidenceRegistry 1.5.0
Maintenance checked

Protocol and capabilities

Server
tulimoa 1.5.0
MCP protocol negotiated in check
2025-11-25
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

5 advertised

search_listings — Search SaaS listings
Advertised by the server during the last successful anonymous check.

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.

search_listings 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."
    }
  }
}
search_listings 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
}
get_listing — Get one SaaS listing
Advertised by the server during the last successful anonymous check.

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.

get_listing 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'."
    }
  }
}
get_listing 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
Advertised by the server during the last successful anonymous check.

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

list_categories input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_categories 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
}
submit_listing — Submit an AI or MCP tool to the Tulimoa directory
Advertised by the server during the last successful anonymous check.

Create a new listing in the Tulimoa directory on behalf of the authenticated user, with the same fields and rules as the web form (https://tulimoa.com/submit/guidelines): AI or MCP software with its own website, the user's own product, at most 2 active listings per account. It starts as 'pending' and is reviewed by hand. Required: logo_url and ai_usage (how the software uses AI or what agents can do with it). Choose how it goes live with `visibility`: 'badge' (free; the Tulimoa badge must already be on the website, this tool checks it) 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. Optional fields match the form: gallery, content blocks, founding year, team size, demo and docs links, data points, X handles and a test request. 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.

submit_listing 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",
    "ai_usage",
    "visibility"
  ],
  "properties": {
    "mcp": {
      "type": "boolean",
      "description": "true = this tool exposes its own MCP server."
    },
    "url": {
      "type": "string",
      "maxLength": 500,
      "description": "The product's own website (http or https). A marketplace page or an app-store-only app is not accepted."
    },
    "name": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1,
      "description": "Product name (max 60 chars)."
    },
    "country": {
      "enum": [
        "AR",
        "AU",
        "AT",
        "BE",
        "BR",
        "BG",
        "CA",
        "CL",
        "CN",
        "CO",
        "HR",
        "CY",
        "CZ",
        "DK",
        "EG",
        "EE",
        "FI",
        "FR",
        "DE",
        "GR",
        "HK",
        "HU",
        "IS",
        "IN",
        "ID",
        "IE",
        "IL",
        "IT",
        "JP",
        "LV",
        "LI",
        "LT",
        "LU",
        "MY",
        "MT",
        "MX",
        "MA",
        "NL",
        "NZ",
        "NG",
        "NO",
        "PE",
        "PH",
        "PL",
        "PT",
        "RO",
        "SA",
        "RS",
        "SG",
        "SK",
        "SI",
        "ZA",
        "KR",
        "ES",
        "SE",
        "CH",
        "TW",
        "TH",
        "TR",
        "UA",
        "AE",
        "GB",
        "US",
        "VN"
      ],
      "type": "string",
      "description": "ISO-3166-1 alpha-2 code of the company's HQ, e.g. DE. Same list as the web form."
    },
    "ai_usage": {
      "type": "string",
      "maxLength": 600,
      "minLength": 40,
      "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."
    },
    "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."
    },
    "demo_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Optional demo or video URL."
    },
    "docs_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Optional documentation URL."
    },
    "gdpr_dpa": {
      "type": "boolean",
      "description": "Optional: a GDPR data processing agreement (DPA) is available."
    },
    "logo_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Required. Public https URL of the company logo: PNG, JPEG, WebP, GIF or AVIF, at least 64 px, max 10 MB. A square icon works best. Tulimoa downloads it, scales it to max 512 px and stores it as WebP."
    },
    "mcp_auth": {
      "type": "array",
      "items": {
        "enum": [
          "oauth",
          "api"
        ],
        "type": "string"
      },
      "maxItems": 2,
      "description": "Only if mcp is true: how agents connect (oauth, api). Empty = no auth."
    },
    "x_handle": {
      "type": "string",
      "maxLength": 40,
      "description": "Optional company X handle, e.g. @acme."
    },
    "team_size": {
      "enum": [
        "1",
        "2-10",
        "11-50",
        "51-250",
        "250+"
      ],
      "type": "string",
      "description": "Optional team size: 1, 2-10, 11-50, 51-250 or 250+."
    },
    "test_note": {
      "type": "string",
      "maxLength": 600,
      "description": "Test request only: what the tester should look at."
    },
    "visibility": {
      "enum": [
        "badge",
        "launch"
      ],
      "type": "string",
      "description": "How the listing goes live (required). 'badge' = free: the Tulimoa badge must ALREADY be embedded on the product website; this tool checks the page and refuses the badge route without it (the error returns the badge HTML to embed). Reviewed within 7 days. If the badge is missing for 7 days later on, the listing is deleted unless the badge is back or the launch package is booked. 'launch' = $5 one-time launch package: no badge needed, reviewed first, optional welcome post on X, refunded automatically if rejected. Ask the user which one they want."
    },
    "data_region": {
      "enum": [
        "eu",
        "eu-option",
        "non-eu",
        "self-hosted"
      ],
      "type": "string",
      "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."
    },
    "launch_hook": {
      "type": "string",
      "maxLength": 140,
      "description": "Launch package with welcome post: one sentence why the tool matters (max 140 chars, English)."
    },
    "open_source": {
      "type": "boolean",
      "description": "Optional: the software is open source."
    },
    "test_access": {
      "type": "string",
      "maxLength": 300,
      "description": "Test request only: a trial link or promo code; the test says so if access was given."
    },
    "founded_year": {
      "type": "integer",
      "maximum": 2100,
      "minimum": 1900,
      "description": "Optional founding year."
    },
    "gallery_urls": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 1000
      },
      "maxItems": 5,
      "description": "Optional screenshots, up to 5 public https image URLs (PNG, JPEG, WebP, GIF or AVIF, max 10 MB each). The first one is the hero image. Tulimoa scales them to max 1280 px and stores them as WebP. Images already stored on Tulimoa (from get_listing) are kept as they are."
    },
    "mcp_docs_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Only if mcp is true: link to the MCP docs."
    },
    "model_source": {
      "enum": [
        "own",
        "open-weight",
        "provider",
        "mixed",
        "none"
      ],
      "type": "string",
      "description": "Optional: which AI models (own, open-weight, provider, mixed, none)."
    },
    "test_request": {
      "type": "boolean",
      "description": "Optional: ask Florian to test the tool by hand (about an hour with a real account; result goes on the listing, on X and into the weekly Radar, including what is missing). Free for now, no right to a test or a date."
    },
    "pricing_model": {
      "enum": [
        "free",
        "freemium",
        "paid",
        "lifetime"
      ],
      "type": "string",
      "description": "Pricing model (required): free | freemium | paid | lifetime."
    },
    "test_x_handle": {
      "type": "string",
      "maxLength": 40,
      "description": "Test request only: the submitter's X handle, to tag them and ask questions."
    },
    "x_post_opt_in": {
      "type": "boolean",
      "description": "Launch package only: a free welcome post on X after approval. Needs launch_hook and at least one X handle."
    },
    "certifications": {
      "type": "array",
      "items": {
        "enum": [
          "soc2",
          "iso27001",
          "hipaa"
        ],
        "type": "string"
      },
      "maxItems": 3,
      "description": "Optional: soc2, iso27001, hipaa."
    },
    "content_blocks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "content"
        ],
        "properties": {
          "type": {
            "enum": [
              "long_description",
              "ideal_for",
              "not_for",
              "key_features",
              "use_cases",
              "integrations"
            ],
            "type": "string"
          },
          "content": {
            "type": "string",
            "maxLength": 600,
            "minLength": 1
          },
          "subject": {
            "type": "string",
            "maxLength": 100,
            "description": "Only for ideal_for and not_for: the short audience after 'Ideal for' / 'Not for', e.g. 'small SaaS teams'."
          }
        }
      },
      "maxItems": 30,
      "description": "Optional profile sections, like in the web form. type: long_description (max 600 chars), ideal_for, not_for, key_features (one feature per line, 5 to 10 lines, max 600), use_cases, integrations (comma-separated). Max 400 chars unless noted. Several blocks of the same type are allowed. Write in English. On edit, the list replaces all blocks."
    },
    "mcp_server_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Only if mcp is true: endpoint URL of the MCP server (e.g. .../mcp)."
    },
    "pricing_detail": {
      "type": "string",
      "maxLength": 400,
      "description": "Optional price detail, e.g. 'from $10/month'."
    },
    "agent_interfaces": {
      "type": "array",
      "items": {
        "enum": [
          "api",
          "cli",
          "sdk",
          "webhooks"
        ],
        "type": "string"
      },
      "maxItems": 4,
      "description": "Optional: other ways agents can use it (api, cli, sdk, webhooks)."
    },
    "gallery_captions": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 120
      },
      "maxItems": 5,
      "description": "Optional captions for gallery_urls, same order, max 120 chars each."
    },
    "hosting_provider": {
      "type": "string",
      "maxLength": 60,
      "description": "Optional hosting provider and location, e.g. 'Hetzner, Falkenstein'."
    },
    "founder_x_handles": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 4,
      "description": "Optional founder X handles (max 4)."
    },
    "notable_customers": {
      "type": "string",
      "maxLength": 200,
      "description": "Optional notable customers, e.g. 'Acme, Globex'."
    },
    "short_description": {
      "type": "string",
      "maxLength": 300,
      "minLength": 1,
      "description": "One-line pitch (max 300 chars), ideally in English."
    },
    "withdrawal_consent": {
      "type": "boolean",
      "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."
    },
    "trains_on_customer_data": {
      "enum": [
        "no",
        "opt-out",
        "yes"
      ],
      "type": "string",
      "description": "Optional: trains on customer data (no, opt-out, yes)."
    }
  }
}
submit_listing output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "id",
    "slug",
    "status",
    "visibility",
    "badge_verified",
    "test_requested",
    "next_step",
    "manage_url"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Listing id."
    },
    "slug": {
      "type": "string",
      "description": "Final slug (may carry a conflict suffix)."
    },
    "status": {
      "type": "string",
      "const": "pending"
    },
    "next_step": {
      "type": "string",
      "description": "What the user has to do now."
    },
    "badge_html": {
      "type": "object",
      "required": [
        "light",
        "dark"
      ],
      "properties": {
        "dark": {
          "type": "string"
        },
        "light": {
          "type": "string"
        }
      },
      "description": "Badge route only: the badge HTML (light = for dark backgrounds, dark = for light backgrounds). Keep it on the site.",
      "additionalProperties": false
    },
    "manage_url": {
      "type": "string",
      "description": "Dashboard page for status, badge check and payment."
    },
    "visibility": {
      "enum": [
        "badge",
        "launch"
      ],
      "type": "string"
    },
    "checkout_url": {
      "type": "string",
      "description": "Launch package only: opens the Polar checkout (Tulimoa login needed)."
    },
    "badge_verified": {
      "type": "boolean",
      "description": "true = the Tulimoa badge was found on the website."
    },
    "test_requested": {
      "type": "boolean",
      "description": "true = a hand test was requested."
    }
  },
  "additionalProperties": false
}
edit_listing — Edit one of your own Tulimoa listings
Advertised by the server during the last successful anonymous check.

Update fields of a listing you own (by slug), with the same fields and rules as the web editor. Only the fields you pass change. Changes to a live listing show right away and are checked by the team afterwards. A changed MCP endpoint on a live listing sends it back into review. Editing a rejected listing resubmits it for review when the rejection reason allows it (not after spam, duplicate, not a product or the listing limit). The Tulimoa badge is re-checked on every edit. Every listing needs a logo: pass logo_url to replace it (required if it has none). gallery_urls and content_blocks replace the whole list. Requires a write-scoped Tulimoa login.

edit_listing input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug"
  ],
  "properties": {
    "mcp": {
      "type": "boolean"
    },
    "url": {
      "type": "string",
      "maxLength": 500,
      "description": "The product's own website (http or https)."
    },
    "name": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1
    },
    "slug": {
      "type": "string",
      "minLength": 1,
      "description": "Slug of YOUR listing to edit (from submit_listing or get_listing)."
    },
    "country": {
      "enum": [
        "AR",
        "AU",
        "AT",
        "BE",
        "BR",
        "BG",
        "CA",
        "CL",
        "CN",
        "CO",
        "HR",
        "CY",
        "CZ",
        "DK",
        "EG",
        "EE",
        "FI",
        "FR",
        "DE",
        "GR",
        "HK",
        "HU",
        "IS",
        "IN",
        "ID",
        "IE",
        "IL",
        "IT",
        "JP",
        "LV",
        "LI",
        "LT",
        "LU",
        "MY",
        "MT",
        "MX",
        "MA",
        "NL",
        "NZ",
        "NG",
        "NO",
        "PE",
        "PH",
        "PL",
        "PT",
        "RO",
        "SA",
        "RS",
        "SG",
        "SK",
        "SI",
        "ZA",
        "KR",
        "ES",
        "SE",
        "CH",
        "TW",
        "TH",
        "TR",
        "UA",
        "AE",
        "GB",
        "US",
        "VN"
      ],
      "type": "string",
      "description": "ISO-3166-1 alpha-2 code of the company's HQ."
    },
    "ai_usage": {
      "type": "string",
      "maxLength": 600,
      "minLength": 40,
      "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."
    },
    "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"
    },
    "demo_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Optional demo or video URL."
    },
    "docs_url": {
      "type": "string",
      "maxLength": 500,
      "description": "Optional documentation URL."
    },
    "gdpr_dpa": {
      "type": "boolean"
    },
    "logo_url": {
      "type": "string",
      "maxLength": 500,
      "description": "New logo. Public https URL of the company logo: PNG, JPEG, WebP, GIF or AVIF, at least 64 px, max 10 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_auth": {
      "type": "array",
      "items": {
        "enum": [
          "oauth",
          "api"
        ],
        "type": "string"
      },
      "maxItems": 2
    },
    "x_handle": {
      "type": "string",
      "maxLength": 40
    },
    "team_size": {
      "enum": [
        "1",
        "2-10",
        "11-50",
        "51-250",
        "250+"
      ],
      "type": "string",
      "description": "Optional team size: 1, 2-10, 11-50, 51-250 or 250+."
    },
    "data_region": {
      "enum": [
        "eu",
        "eu-option",
        "non-eu",
        "self-hosted"
      ],
      "type": "string",
      "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."
    },
    "launch_hook": {
      "type": "string",
      "maxLength": 140
    },
    "open_source": {
      "type": "boolean",
      "description": "Optional: the software is open source."
    },
    "founded_year": {
      "type": "integer",
      "maximum": 2100,
      "minimum": 1900,
      "description": "Optional founding year."
    },
    "gallery_urls": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 1000
      },
      "maxItems": 5,
      "description": "Optional screenshots, up to 5 public https image URLs (PNG, JPEG, WebP, GIF or AVIF, max 10 MB each). The first one is the hero image. Tulimoa scales them to max 1280 px and stores them as WebP. Images already stored on Tulimoa (from get_listing) are kept as they are."
    },
    "mcp_docs_url": {
      "type": "string",
      "maxLength": 500
    },
    "model_source": {
      "enum": [
        "own",
        "open-weight",
        "provider",
        "mixed",
        "none"
      ],
      "type": "string"
    },
    "pricing_model": {
      "enum": [
        "free",
        "freemium",
        "paid",
        "lifetime"
      ],
      "type": "string"
    },
    "certifications": {
      "type": "array",
      "items": {
        "enum": [
          "soc2",
          "iso27001",
          "hipaa"
        ],
        "type": "string"
      },
      "maxItems": 3
    },
    "content_blocks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "content"
        ],
        "properties": {
          "type": {
            "enum": [
              "long_description",
              "ideal_for",
              "not_for",
              "key_features",
              "use_cases",
              "integrations"
            ],
            "type": "string"
          },
          "content": {
            "type": "string",
            "maxLength": 600,
            "minLength": 1
          },
          "subject": {
            "type": "string",
            "maxLength": 100,
            "description": "Only for ideal_for and not_for: the short audience after 'Ideal for' / 'Not for', e.g. 'small SaaS teams'."
          }
        }
      },
      "maxItems": 30,
      "description": "Optional profile sections, like in the web form. type: long_description (max 600 chars), ideal_for, not_for, key_features (one feature per line, 5 to 10 lines, max 600), use_cases, integrations (comma-separated). Max 400 chars unless noted. Several blocks of the same type are allowed. Write in English. On edit, the list replaces all blocks."
    },
    "mcp_server_url": {
      "type": "string",
      "maxLength": 500,
      "description": "MCP endpoint. Changing it on a live listing sends it back into review."
    },
    "pricing_detail": {
      "type": "string",
      "maxLength": 400
    },
    "agent_interfaces": {
      "type": "array",
      "items": {
        "enum": [
          "api",
          "cli",
          "sdk",
          "webhooks"
        ],
        "type": "string"
      },
      "maxItems": 4
    },
    "gallery_captions": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 120
      },
      "maxItems": 5,
      "description": "Optional captions for gallery_urls, same order, max 120 chars each."
    },
    "hosting_provider": {
      "type": "string",
      "maxLength": 60
    },
    "founder_x_handles": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 4
    },
    "notable_customers": {
      "type": "string",
      "maxLength": 200,
      "description": "Optional notable customers, e.g. 'Acme, Globex'."
    },
    "short_description": {
      "type": "string",
      "maxLength": 300,
      "minLength": 1
    },
    "trains_on_customer_data": {
      "enum": [
        "no",
        "opt-out",
        "yes"
      ],
      "type": "string"
    }
  }
}
edit_listing output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "id",
    "slug",
    "status",
    "badge_verified",
    "back_in_review"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Listing id."
    },
    "slug": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "description": "Status after the edit: approved (live), pending (in review) or rejected."
    },
    "back_in_review": {
      "type": "boolean",
      "description": "true = the edit sent the listing (back) into review."
    },
    "badge_verified": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1105 ms
95th percentile latency
1105 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1105 ms · metadata changed · 5 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http tulimoa-mcp https://mcp.tulimoa.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add tulimoa-mcp --url https://mcp.tulimoa.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable tulimoa-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "tulimoa-mcp": {
      "url": "https://mcp.tulimoa.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "tulimoa-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.tulimoa.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start tulimoa-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "tulimoa-mcp": {
      "type": "http",
      "url": "https://mcp.tulimoa.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http tulimoa-mcp https://mcp.tulimoa.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.tulimoa.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "tulimoa-mcp": {
      "serverUrl": "https://mcp.tulimoa.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Tulimoa MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Tulimoa MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing