MCPサーバー

WhatAreYouBuilding.AI

ai.whatareyoubuilding/wayb
ビジネス・業務 検索・リサーチ 公開・接続可能 MCP 2026-07-28

このMCPでできること

Searches and retrieves directory listings for independent products, builders, and communities, including engagement and funding information.

fetch
Fetch a directory record
Fetch the full text of one directory record by an id returned from search. Ids are prefixed to say which collection they belong to: "product:<id>" or "community:<id>". Call this after search, on the ids it returned, when the lightweight result is not enough to answer the question. It is the second half of the search/fetch pair that deep-research clients expect. Do not call it with an id you constructed yourself or took from a URL — use get_product or get_community for those, which take a bare id and return structured fields instead of text. Prose in, prose out: this returns a readable record, not a typed object.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'A prefixed id from search, e.g. "product:unkey".'}}, 'additionalProperties': False}
get_community
Get a community
Retrieve one community by its directory id, including its join link, platform, region, topic and member count where one was given. Call this to answer a specific question about one group, or after search_communities when a shortlist needs the join links filled in. Do not call it to discover communities: it takes an id and nothing else. Search first. An unknown id returns not-found rather than a guess.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Community id, e.g. "indie-tlv".'}}, 'additionalProperties': False}
get_leaderboard
Get the engagement leaderboard
Rank products by engagement on the directory — upvotes, outbound clicks, impressions, shares or verified backlinks — optionally narrowed to one region or category to get a sub-league. Call this for any question about relative standing: what is getting attention, what is doing well in a country or category, what to look at first in an unfamiliar segment. Two orderings, and they answer different questions. sort=score (the default) ranks on the lifetime counter and answers "what is biggest" — it is stable, and a listing collecting clicks for six months outranks one that arrived on Tuesday. sort=movers ranks on clicks gained during the LAST COMPLETED WEEK and answers "what is happening"; it is the only view where something new can be first, and it is the right call for "what is rising", "what is new", or "what changed this week". Be careful what you claim from it. This is attention on this directory and nothing else — not revenue, not users, not growth, and not a judgement about quality. MRR is never a ranking axis here. A product can rank highly because it was interesting to click on. Nothing on this board is bought: no badge, streak or payment moves a listing up it. The movers board describes the week that closed last Sunday, not the last seven days, and the `week` field in the response names it — do not report it as live. Listings with no reading a week ago are not in it at all; the `unmeasured` count says how many that was. metric=backlinks is different in kind from the browsing axes: it ranks people who link back to their listing from their own site, scored on the traffic that link actually sent (stats.referrals) and counted only where our crawler independently found the link. Use it for "who is actually promoting their listing" rather than "who is getting attention here". A listing with referrals but backlink.verified false scores zero on it. Do not call it to filter or find products by their attributes; that is search_products. The board is empty until real engagement accumulates, and an empty board means no traffic yet, not that no products exist.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'sort': {'enum': ['score', 'movers'], 'type': 'string', 'description': 'score ranks on the lifetime counter (default). movers ranks on clicks gained during the last completed week — use it for what is rising rather than what is biggest.'}, 'limit': {'type': 'integer', 'description': 'How many ranks to return. Defaults to 10.'}, 'metric': {'enum': ['upvotes', 'clicks', 'impressions', 'shares', 'backlinks'], 'type': 'string', 'description': "Ranking axis for sort=score. Defaults to clicks. upvotes is the only axis a person chooses rather than one measured from browsing — one vote per person per listing per week, so it ranks distinct backers. backlinks ranks on referred visits arriving through a crawler-verified link on the builder's own site. Ignored when sort is movers, which is always clicks gained in the week."}, 'region': {'type': 'string', 'description': 'Country name, e.g. "Israel", "United States", "Nigeria". Case-insensitive. Omit for all regions.'}, 'category': {'type': 'string', 'description': 'Narrow to one category.'}}, 'additionalProperties': False}
get_product
Get a product
Retrieve one product by its directory id, with full builder attribution, links, funding state and engagement stats. Returns strictly more per record than a search result: the builder's own accounts and the product's, the website, the city, opt-in MRR where the builder published one, and all-time clicks and impressions. Call this to answer anything specific about a single product — how to reach the builder, where they are, whether they are raising, what the listing actually claims — and call it once per product after a search when a shortlist needs filling out. Do not call it to discover products: it takes an id and nothing else, so it cannot answer "find me X". Search first. Ids are the slug in the product URL, not the display name. An unknown id returns not-found rather than a guess.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Product id, e.g. "unkey".'}}, 'additionalProperties': False}
list_filters
List available filters
List every region, category, funding stage and platform that currently has listings, with counts. Call this before the first search of a conversation, and whenever a filter value is in doubt. The vocabularies are closed and curated — a region or category that is not on this list matches nothing, and an empty result from a guessed filter is indistinguishable from a genuinely empty directory. The counts are also the fastest way to see the shape of the directory: which markets are represented, where the listings actually are, and which filters are worth offering someone. Takes no arguments and is cheap. There is no reason to avoid calling it.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {}, 'additionalProperties': False}
search
Search the directory
Search across both products and communities at once, returning lightweight results — id, title, url — for retrieval with fetch. Call this when you do not know which collection the answer lives in, or when you are a deep-research client that expects the conventional search/fetch pair. It is deliberately thin: it is the discovery half, and fetch is the other half. Do not call it when you already know you want products or communities specifically — search_products and search_communities take real filters (region, category, funding stage, raising status, platform) and return structured fields instead of prose, which is almost always the better answer. Ids come back prefixed as "product:<id>" or "community:<id>"; pass them to fetch unchanged.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': 'What to look for.'}}, 'additionalProperties': False}
search_communities
Search communities
Search builder communities — the Slack workspaces, WhatsApp groups and meetups that independent builders actually gather in — by free text, region, topic and platform. Each result carries a real join link. Call this when someone wants to reach a scene rather than a person: where founders in a given country talk to each other, which group covers a topic, where to go to meet builders in a region. Do not call it to find products or their builders — that is search_products. Communities and products are separate records; a community is a group of people, not something someone shipped. Member counts appear only where the organisers stated one, so a null count means unknown, not small.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Max results, 1-100.'}, 'query': {'type': 'string', 'description': 'Free text matched against name and one-liner.'}, 'offset': {'type': 'integer', 'description': 'Results to skip, for paging.'}, 'region': {'type': 'string', 'description': 'Country name, e.g. "Israel", "United States", "Nigeria". Case-insensitive. Omit for all regions.'}, 'category': {'type': 'string', 'description': 'Topic, e.g. "AI", "Fintech", or "General".'}, 'platform': {'enum': ['slack', 'whatsapp', 'meetup', 'other'], 'type': 'string', 'description': 'Where the community lives.'}}, 'additionalProperties': False}
search_products
Search products
Search the directory of builder products. Filter by free text, region, category, funding stage, whether the builder is actively raising, and what they are open to. Returns the matching products with their builder attribution and engagement stats. Call this whenever someone wants to find products or the people behind them by any of those axes — "who is building fintech in Nigeria", "indie AI tools whose founders are raising", "what has this person shipped". It is the right tool for deal sourcing and scouting: raising_status and open_to together answer "who wants to hear from an investor", and region is the axis this directory is organised around. Do not call it to rank or compare products by traction — that is get_leaderboard. Do not call it when you already hold a product id; get_product returns more per record. Funding is opt-in: funding_stage may be "undisclosed" and actively_raising may be null, both meaning the builder declined to say rather than that the answer is no.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'sort': {'enum': ['recent', 'raising_first', 'most_clicked', 'most_seen', 'most_backed'], 'type': 'string', 'description': 'Result ordering. Defaults to recent.'}, 'limit': {'type': 'integer', 'description': 'Max results, 1-100. Defaults to 25.'}, 'query': {'type': 'string', 'description': 'Free text matched against product name, one-liner, builder name, category, region and city. Every word must match.'}, 'offset': {'type': 'integer', 'description': 'Results to skip, for paging.'}, 'region': {'type': 'string', 'description': 'Country name, e.g. "Israel", "United States", "Nigeria". Case-insensitive. Omit for all regions.'}, 'open_to': {'enum': ['investment', 'advisors', 'beta-users', 'co-founders', 'partnerships', 'hiring'], 'type': 'string', 'description': 'Return only products open to this kind of contact.'}, 'category': {'type': 'string', 'description': 'Product category, e.g. "AI", "Fintech", "Dev Tools". Call list_filters for the full list. A listing may carry up to three, and this matches any of them.'}, 'funding_stage': {'enum': ['bootstrapped', 'pre-seed', 'seed', 'series-a', 'undisclosed'], 'type': 'string', 'description': 'Funding stage of the product. "undisclosed" means the builder chose not to state a stage; it is not a stage between or below the others, and it does not imply bootstrapped.'}, 'raising_status': {'enum': ['raising', 'not_raising', 'undisclosed'], 'type': 'string', 'description': 'Whether the builder is raising, as three distinct answers. "raising" = they said yes. "not_raising" = they said no. "undisclosed" = they declined to say, which is NOT the same as no and must never be reported as no. Independent of funding_stage. Prefer this over actively_raising.'}, 'actively_raising': {'type': 'boolean', 'description': 'Two-value shorthand for raising_status: true is "raising", false is "not_raising". Neither value returns builders who declined to disclose; ask for raising_status="undisclosed" to see those. raising_status wins if both are sent.'}}, 'additionalProperties': False}
submit_product
Submit a product to the directory
Add a product to the directory on behalf of the builder whose agent token this call carries. Call this when the person you are working for has asked to be listed here, or has asked you to add a product they built. Do not call it to add somebody else's product, and do not call it speculatively — a listing is a public claim about a real builder. REQUIRES A TOKEN: send `Authorization: Bearer wayb_…`. A builder creates one at /mine while signed in; without it this tool refuses and every other tool here still works. The listing is created as PENDING and is reviewed before it appears — a successful call returns an id and a status of "pending", never a live listing. Do not report it as published. Submit the builder's OWN product. One product per builder, and the directory refuses a second copy of a product it already lists (by website host or by name) with a message saying so. Call list_filters first: category and region are closed vocabularies, and a value outside them is rejected rather than corrected. Funding fields are optional and tri-state — omit activelyRaising, or send null, where the builder has not said. Do not infer it, and do not send false to mean "did not say".
外部アクセスあり
入力スキーマ
{'type': 'object', 'required': ['name', 'oneLiner', 'description', 'websiteUrl', 'category', 'region', 'fundingStage', 'builder'], 'properties': {'mrr': {'type': ['number', 'null'], 'description': 'Monthly recurring revenue, only where the builder chose to publish it.'}, 'city': {'type': 'string', 'description': 'City, or null.'}, 'name': {'type': 'string', 'description': 'The product name, up to 80 characters.'}, 'openTo': {'type': 'array', 'items': {'enum': ['investment', 'advisors', 'beta-users', 'co-founders', 'partnerships', 'hiring'], 'type': 'string'}, 'description': 'What the builder invited contact about. Omit for none.'}, 'region': {'type': 'string', 'description': 'REQUIRED. Country name from list_filters. Closed vocabulary. Use "Global" where the builder is not anywhere in particular or would rather not say — that is a real answer on this list, and it is the one to send rather than guessing a country or omitting the field.'}, 'builder': {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string'}, 'region': {'type': ['string', 'null']}, 'socials': {'type': 'object', 'description': 'Accounts keyed by platform, e.g. { "x": "…" }.'}, 'avatarUrl': {'type': ['string', 'null']}}, 'description': 'Attribution. `name` is required; the rest is optional.'}, 'logoUrl': {'type': 'string', 'description': 'An https URL to a square logo, or null.'}, 'socials': {'type': 'object', 'description': 'The PRODUCT\'s own accounts, keyed by platform — not the builder\'s, which go under `builder.socials`. Keys: `x`, `linkedin`, `instagram`, `tiktok`, `youtube`, `facebook`, `github`, `email`. Each is `{ "url": "…" }` except `x`, which is `{ "handle": "…" }`, and `email`, which is `{ "address": "…" }` and should be a business address (support@, hello@) rather than a person\'s. `github` is the PRODUCT\'s repository — the code somebody would clone. The builder\'s own GitHub account is a different thing and goes in `builder.socials.github`.'}, 'category': {'type': 'string', 'description': "REQUIRED. The product's MAIN category, from list_filters. Closed vocabulary. This is the one a row, a card and the sharing image show."}, 'oneLiner': {'type': 'string', 'description': 'One sentence saying what it does, up to 80 characters. Not a tagline.'}, 'categories': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional. Up to 3 categories from list_filters, MAIN FIRST — for a product that is honestly more than one thing (an AI agent that is also a dev tool). The first must be the same value as `category`; send it first or leave it out of the list and it is put there. A listing is findable and filed under all of them, so send only the ones the builder would claim: three loosely-related categories are worse for them than one true one. Ask the builder rather than inferring from their site.'}, 'websiteUrl': {'type': 'string', 'description': "REQUIRED. The product's own https URL — the address a reader opens. A code repository or an app store page counts. REFUSED: a shared document (Drive, Docs, Dropbox, Notion), and a free platform deploy subdomain (vercel.app, netlify.app, github.io, web.app, railway.app and the like) — the builder needs a domain of their own first. Never invent one: ask the builder."}, 'description': {'type': 'string', 'description': "REQUIRED, up to 800 characters. A short paragraph in the builder's OWN words about what the product is and who it is for, shown on the listing's own page. Plain text — links are not rendered, so put the address in websiteUrl. Never write it yourself, and never pad it to a length: ask the builder for it, the way you would ask for the URL. A short answer in their words is worth more here than a long one in yours. It became required on 2026-09-03 because a listing without one has nothing on its page a search engine can tell apart from every other listing."}, 'fundingStage': {'enum': ['bootstrapped', 'pre-seed', 'seed', 'series-a', 'undisclosed'], 'type': 'string', 'description': 'Funding stage. Use "undisclosed" where the builder has not said — never guess.'}, 'activelyRaising': {'type': ['boolean', 'null'], 'description': 'true, false, or null for "would rather not say". Default null.'}}, 'additionalProperties': False}
追加
fetch
2026年10月4日2:40
追加
search
2026年10月4日2:40
追加
submit_product
2026年10月4日2:40
追加
list_filters
2026年10月4日2:40
追加
get_leaderboard
2026年10月4日2:40
追加
get_community
2026年10月4日2:40
追加
search_communities
2026年10月4日2:40
追加
get_product
2026年10月4日2:40
追加
search_products
2026年10月4日2:40