Stack intelligence from real production Rails apps. Compare gems, scan a Gemfile.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
ADMIN ONLY - the feature/changelog ledger over MCP. Requires an admin Bearer token. This is the source of truth for what shipped - log an entry here right after shipping something instead of hand-editing docs/changelog.md, so the record can't drift from reality. Entries left un-digested automatically get folded into the next Monday promotional digest (see admin_newsletters). Actions: 'list' shows recent entries (filter by category or digest status); 'create' logs a new entry (title, description, category, optional version); 'update' edits an entry by id; 'destroy' removes one.
list | create | update | destroy
Entry id - required for update/destroy
create/update: short headline
create/update: e.g. '6.11.0' (optional)
create/update: added | changed | fixed | improved
create/update: the technical detail
list: only entries not yet included in a digest
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
ADMIN ONLY - the feature/changelog ledger over MCP. Requires an admin Bearer token. This is the source of truth for what shipped - log an entry here right after shipping something instead of hand-editing docs/changelog.md, so the record can't drift from reality. Entries left un-digested automatically get folded into the next Monday promotional digest (see admin_newsletters). Actions: 'list' shows recent entries (filter by category or digest status); 'create' logs a new entry (title, description, category, optional version); 'update' edits an entry by id; 'destroy' removes one.
| Argument | Type | Description |
|---|---|---|
| id | integer | Entry id - required for update/destroy |
| title | string | create/update: short headline |
| action* | string | list | create | update | destroy |
| version | string | create/update: e.g. '6.11.0' (optional) |
| category | string | create/update: added | changed | fixed | improved |
| description | string | create/update: the technical detail |
| pending_only | boolean | list: only entries not yet included in a digest |
{
"type": "object",
"required": [
"action"
],
"properties": {
"id": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Entry id - required for update/destroy"
},
"title": {
"type": "string",
"minLength": 1,
"description": "create/update: short headline"
},
"action": {
"enum": [
"list",
"create",
"update",
"destroy"
],
"type": "string",
"minLength": 1,
"description": "list | create | update | destroy"
},
"version": {
"type": "string",
"minLength": 1,
"description": "create/update: e.g. '6.11.0' (optional)"
},
"category": {
"enum": [
"added",
"changed",
"fixed",
"improved"
],
"type": "string",
"minLength": 1,
"description": "create/update: added | changed | fixed | improved"
},
"description": {
"type": "string",
"minLength": 1,
"description": "create/update: the technical detail"
},
"pending_only": {
"not": {
"type": "null"
},
"type": "boolean",
"description": "list: only entries not yet included in a digest"
}
}
}ADMIN ONLY - moderate BuiltOnRails listings over MCP. Requires an admin Bearer token (Authorization header). Actions: 'pending' lists products awaiting review; 'approve' / 'reject' run the review lifecycle on a product slug; 'feature' / 'unfeature' toggle homepage featuring; 'stats' returns moderation counts. Params: action (required); slug (required for approve/reject/feature/unfeature); limit (pending only, default 10, max 50).
| Argument | Type | Description |
|---|---|---|
| slug | string | Product slug — required for approve/reject/feature/unfeature |
| limit | integer | Max results for 'pending' (default 10, max 50) |
| action* | string | One of: pending, approve, reject, feature, unfeature, stats |
{
"type": "object",
"required": [
"action"
],
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "Product slug — required for approve/reject/feature/unfeature"
},
"limit": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Max results for 'pending' (default 10, max 50)"
},
"action": {
"enum": [
"pending",
"approve",
"reject",
"feature",
"unfeature",
"stats"
],
"type": "string",
"minLength": 1,
"description": "One of: pending, approve, reject, feature, unfeature, stats"
}
}
}ADMIN ONLY - batch-review the curated news queue (ContentItems behind /daily and the newsletter) over MCP. Requires an admin Bearer token. Actions: 'queue' lists items awaiting review (filter by feed name or search term); 'select' / 'reject' batch-review by ids (array); 'stats' returns queue counts by status and top feeds. Typical flow: queue -> read titles -> select the good ids, reject the noise, in batches.
| Argument | Type | Description |
|---|---|---|
| ids | array | ContentItem ids - required for select/reject (max 100 per call) |
| feed | string | queue: filter by content feed name (partial match) |
| limit | integer | queue: max results (default 25, max 50) |
| query | string | queue: search term matched against title |
| action* | string | queue | select | reject | stats |
{
"type": "object",
"required": [
"action"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "ContentItem ids - required for select/reject (max 100 per call)"
},
"feed": {
"type": "string",
"minLength": 1,
"description": "queue: filter by content feed name (partial match)"
},
"limit": {
"not": {
"type": "null"
},
"type": "integer",
"description": "queue: max results (default 25, max 50)"
},
"query": {
"type": "string",
"minLength": 1,
"description": "queue: search term matched against title"
},
"action": {
"enum": [
"queue",
"select",
"reject",
"stats"
],
"type": "string",
"minLength": 1,
"description": "queue | select | reject | stats"
}
}
}ADMIN ONLY - queue and send promotional/update newsletters over MCP. Requires an admin Bearer token. Each newsletter is only ever delivered once per subscriber, even across retries. The 'all_subscribed' segment is additionally throttled: it skips anyone who got a newsletter in the last 7 days or any email at all in the last 2 days, so promos never stack on top of other mail. Leaving an 'all_subscribed' newsletter as a draft (don't call send_now) queues it for the automatic weekly digest every Monday 10am, which folds all pending drafts into one combined email instead of several separate sends. Actions: 'list' shows recent newsletters with status and segment; 'segments' returns live, throttle-aware recipient counts for each segment so you can preview reach before sending; 'pending_digest' lists drafts currently queued for next Monday's digest; 'create' drafts a newsletter (subject, content, segment); 'update' edits a draft/scheduled newsletter's fields; 'send_now' sends immediately in the background instead of waiting for the digest; 'destroy' deletes a newsletter.
| Argument | Type | Description |
|---|---|---|
| id | integer | Newsletter id - required for update/send_now/destroy |
| action* | string | list | segments | pending_digest | create | update | send_now | destroy |
| content | string | create/update: body, plain text or markdown |
| segment | string | create/update: 'inactive' (re-engage users quiet 14+ days) or 'all_subscribed' (promotional blast to everyone opted into the newsletter). Defaults to 'inactive'. |
| subject | string | create/update: email subject line |
ADMIN ONLY - manage site sponsors over MCP. Requires an admin Bearer token. Actions: 'list' shows sponsors with performance (impressions, clicks, CTR, running state); 'create' adds a manual sponsor (name, url, position, optional tagline/dates); 'update' changes fields on a sponsor by id; 'activate' / 'deactivate' toggle a sponsor; 'inquiries' lists sponsorship inquiries; 'inquiry_status' moves an inquiry through pending -> contacted -> converted/declined; 'orders' lists self-serve sponsor orders.
| Argument | Type | Description |
|---|---|---|
| id | integer | Sponsor id (update/activate/deactivate) or inquiry id (inquiry_status) |
| url | string | create/update: sponsor link URL |
| name | string | create/update: sponsor name |
| action* | string | list | create | update | activate | deactivate | inquiries | inquiry_status | orders |
| status | string | inquiry_status: pending | contacted | converted | declined |
| ends_at | string | create/update: end date, YYYY-MM-DD (omit = open-ended) |
| tagline | string | create/update: short tagline shown on the ad |
| cta_text | string | create/update: call-to-action label (default 'Learn More') |
Compare two technology stacks head-to-head with real adoption data. Returns products count, GitHub stars, collections, growth trends, and a winner. Uses the same scoring algorithm as the BuiltOnRails Stack Showdown feature.
| Argument | Type | Description |
|---|---|---|
| stack1* | string | First stack name (e.g. 'Sidekiq') |
| stack2* | string | Second stack name (e.g. 'Solid Queue') |
{
"type": "object",
"required": [
"stack1",
"stack2"
],
"properties": {
"stack1": {
"type": "string",
"minLength": 1,
"description": "First stack name (e.g. 'Sidekiq')"
},
"stack2": {
"type": "string",
"minLength": 1,
"description": "Second stack name (e.g. 'Solid Queue')"
}
}
}Detect technology stacks from a Gemfile, gemspec, package.json, or importmap.rb content. Paste your dependency file content and get back matched stacks with real adoption data. The killer feature for coding agents — understand your project's stack landscape instantly.
| Argument | Type | Description |
|---|---|---|
| gemfile | string | Raw Gemfile content |
| gemspec | string | Raw .gemspec content — gems declare deps here, not in the Gemfile |
| importmap | string | Raw config/importmap.rb content |
| package_json | string | Raw package.json content |
{
"type": "object",
"required": [],
"properties": {
"gemfile": {
"type": "string",
"minLength": 1,
"description": "Raw Gemfile content"
},
"gemspec": {
"type": "string",
"minLength": 1,
"description": "Raw .gemspec content — gems declare deps here, not in the Gemfile"
},
"importmap": {
"type": "string",
"minLength": 1,
"description": "Raw config/importmap.rb content"
},
"package_json": {
"type": "string",
"minLength": 1,
"description": "Raw package.json content"
}
}
}Get all available stack categories with descriptions and stack counts. Useful for understanding what types of technologies are tracked and filtering searches.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Get a curated stack collection by slug. Collections are hand-picked sets of technology stacks with notes and optional LLM prompts for AI context. Returns the collection with all stacks in order, notes, and the LLM prompt if available.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Collection slug (e.g. 'modern-rails-2024', 'essential-saas-stack') |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "Collection slug (e.g. 'modern-rails-2024', 'essential-saas-stack')"
}
}
}Read curated Rails ecosystem news and articles - the same pipeline behind builtonrails.com/daily. Returns recent items (title, url, summary, category, source). Filter by category (article, release, podcast, video, news), a specific date (YYYY-MM-DD), or a search term. Use this for 'what's new in Rails', release announcements, and article discovery.
| Argument | Type | Description |
|---|---|---|
| date | string | Specific day, YYYY-MM-DD |
| limit | integer | Max results (default 15, max 50) |
| query | string | Search term matched against title and summary |
| category | string | Filter: article, release, podcast, video, news |
{
"type": "object",
"required": [],
"properties": {
"date": {
"type": "string",
"minLength": 1,
"description": "Specific day, YYYY-MM-DD"
},
"limit": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Max results (default 15, max 50)"
},
"query": {
"type": "string",
"minLength": 1,
"description": "Search term matched against title and summary"
},
"category": {
"enum": [
"article",
"release",
"podcast",
"video",
"news"
],
"type": "string",
"minLength": 1,
"description": "Filter: article, release, podcast, video, news"
}
}
}Get detailed information about a specific production Rails application. Returns full product details including description, tags, member, stacks, and vote count.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Product slug (e.g. 'shopify', 'hey', 'github') |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "Product slug (e.g. 'shopify', 'hey', 'github')"
}
}
}Find real Rails applications that use specific technology stacks. Returns approved products using ALL specified stacks, with their full stack lists and vote counts. Great for finding real-world examples of specific tech stack combinations.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of products to return (default: 10, max: 25) |
| stacks* | array | Stack names to search for (e.g. ['PostgreSQL', 'Sidekiq']). Returns products using ALL specified stacks. |
{
"type": "object",
"required": [
"stacks"
],
"properties": {
"limit": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Maximum number of products to return (default: 10, max: 25)"
},
"stacks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Stack names to search for (e.g. ['PostgreSQL', 'Sidekiq']). Returns products using ALL specified stacks."
}
}
}Get stack recommendations based on what real Rails apps use together. Given your current stacks, recommends the most popular stacks in a target category based on co-occurrence in production Rails applications. Available categories: Framework, Database, Frontend, Background, Search, Auth, Payments, DevOps, Testing, Analytics, LLM, AI/ML, Observability, Security, Email.
| Argument | Type | Description |
|---|---|---|
| category* | string | Category to get recommendations for (e.g. 'Background', 'Auth', 'Testing') |
| current_stacks* | array | Your current stacks (e.g. ['PostgreSQL', 'Hotwire', 'Tailwind CSS']) |
{
"type": "object",
"required": [
"current_stacks",
"category"
],
"properties": {
"category": {
"type": "string",
"minLength": 1,
"description": "Category to get recommendations for (e.g. 'Background', 'Auth', 'Testing')"
},
"current_stacks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Your current stacks (e.g. ['PostgreSQL', 'Hotwire', 'Tailwind CSS'])"
}
}
}Get adoption trend data for a technology stack over time. Returns historical usage snapshots showing how many Rails apps use the stack, plus growth percentage. Useful for understanding if a stack is growing or declining.
| Argument | Type | Description |
|---|---|---|
| days | integer | Number of days of trend data (default: 90, max: 365) |
| stack_name* | string | Stack name (e.g. 'Solid Queue', 'Sidekiq') |
{
"type": "object",
"required": [
"stack_name"
],
"properties": {
"days": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Number of days of trend data (default: 90, max: 365)"
},
"stack_name": {
"type": "string",
"minLength": 1,
"description": "Stack name (e.g. 'Solid Queue', 'Sidekiq')"
}
}
}OWNERS ONLY - manage your own products over MCP. Requires a write-scope Bearer token; you can only touch products you submitted or founded. Actions: 'list' shows your products; 'update' edits fields on one of your products (description, url, product_type, tags, github_repo_path); 'post_update' publishes a product update (title + update_type, optional content/url/version) shown on your product page; 'updates' lists a product's recent updates. Params: action (required); slug (required except for 'list').
| Argument | Type | Description |
|---|---|---|
| url | string | update: new product URL / post_update: link for the update |
| slug | string | Product slug — required for update/post_update/updates |
| tags | array | update: replace product tags |
| title | string | post_update: update title (required for post_update) |
| action* | string | One of: list, update, post_update, updates |
| content | string | post_update: update body (markdown, max 10k chars) |
| version | string | post_update: version string for 'release' updates (e.g. '2.1.0') |
| description | string | update: new product description |
Search real production Rails applications and the stacks they actually run. Returns approved products with name, URL, type, votes, and stacks. Filter by product type or sort by votes/newest.
| Argument | Type | Description |
|---|---|---|
| sort | string | Sort order: 'votes' (most upvoted) or 'newest' (default) |
| type | string | Filter by product type (e.g. 'SaaS', 'Gem', 'Open Source', 'Marketplace') |
| limit | integer | Max results (default: 10, max: 25) |
| query | string | Search term to match product name (e.g. 'shopify', 'hey') |
{
"type": "object",
"required": [],
"properties": {
"sort": {
"enum": [
"votes",
"newest"
],
"type": "string",
"minLength": 1,
"description": "Sort order: 'votes' (most upvoted) or 'newest' (default)"
},
"type": {
"type": "string",
"minLength": 1,
"description": "Filter by product type (e.g. 'SaaS', 'Gem', 'Open Source', 'Marketplace')"
},
"limit": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Max results (default: 10, max: 25)"
},
"query": {
"type": "string",
"minLength": 1,
"description": "Search term to match product name (e.g. 'shopify', 'hey')"
}
}
}Search for technology stacks (gems, frameworks, services) used by Rails applications. Returns matching stacks with real adoption data including product counts, GitHub stars, and category. Available categories: Framework, Database, Frontend, Background, Search, Auth, Payments, DevOps, Testing, Analytics, LLM, AI/ML, Observability, Security, Email.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search term (e.g. 'sidekiq', 'auth', 'postgres') |
| category | string | Filter by category: Framework, Database, Frontend, Background, Search, Auth, Payments, DevOps, Testing, Analytics, LLM, AI/ML, Observability, Security, Email |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Search term (e.g. 'sidekiq', 'auth', 'postgres')"
},
"category": {
"type": "string",
"minLength": 1,
"description": "Filter by category: Framework, Database, Frontend, Background, Search, Auth, Payments, DevOps, Testing, Analytics, LLM, AI/ML, Observability, Security, Email"
}
}
}Add a Rails application to BuiltOnRails so its stack becomes part of the data. The product is created with 'pending' status and goes through admin approval. Attach stacks by name, or paste your Gemfile / package.json / importmap.rb content and the real stack is detected and attached automatically - the recommended path.
| Argument | Type | Description |
|---|---|---|
| url* | string | Product website URL (e.g. 'https://shopify.com') |
| name* | string | Product name (e.g. 'Shopify') |
| stacks | array | Stack names to associate (e.g. ['PostgreSQL', 'Sidekiq']) |
| gemfile | string | Raw Gemfile content - stacks are auto-detected and attached |
| importmap | string | Raw config/importmap.rb content - stacks are auto-detected and attached |
| description* | string | Short description of the product |
| package_json | string | Raw package.json content - stacks are auto-detected and attached |
| product_type | string | Type: SaaS, Gem, Open Source, Marketplace, Tool, Platform, Agency, Studio |
{
"type": "object",
"required": [
"action"
],
"properties": {
"id": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Newsletter id - required for update/send_now/destroy"
},
"action": {
"enum": [
"list",
"segments",
"pending_digest",
"create",
"update",
"send_now",
"destroy"
],
"type": "string",
"minLength": 1,
"description": "list | segments | pending_digest | create | update | send_now | destroy"
},
"content": {
"type": "string",
"minLength": 1,
"description": "create/update: body, plain text or markdown"
},
"segment": {
"enum": [
"inactive",
"all_subscribed"
],
"type": "string",
"minLength": 1,
"description": "create/update: 'inactive' (re-engage users quiet 14+ days) or 'all_subscribed' (promotional blast to everyone opted into the newsletter). Defaults to 'inactive'."
},
"subject": {
"type": "string",
"minLength": 1,
"description": "create/update: email subject line"
}
}
}| position | string | create/update: sidebar | banner | featured |
| starts_at | string | create/update: start date, YYYY-MM-DD (omit = immediately) |
{
"type": "object",
"required": [
"action"
],
"properties": {
"id": {
"not": {
"type": "null"
},
"type": "integer",
"description": "Sponsor id (update/activate/deactivate) or inquiry id (inquiry_status)"
},
"url": {
"type": "string",
"minLength": 1,
"description": "create/update: sponsor link URL"
},
"name": {
"type": "string",
"minLength": 1,
"description": "create/update: sponsor name"
},
"action": {
"enum": [
"list",
"create",
"update",
"activate",
"deactivate",
"inquiries",
"inquiry_status",
"orders"
],
"type": "string",
"minLength": 1,
"description": "list | create | update | activate | deactivate | inquiries | inquiry_status | orders"
},
"status": {
"enum": [
"pending",
"contacted",
"converted",
"declined"
],
"type": "string",
"minLength": 1,
"description": "inquiry_status: pending | contacted | converted | declined"
},
"ends_at": {
"type": "string",
"minLength": 1,
"description": "create/update: end date, YYYY-MM-DD (omit = open-ended)"
},
"tagline": {
"type": "string",
"minLength": 1,
"description": "create/update: short tagline shown on the ad"
},
"cta_text": {
"type": "string",
"minLength": 1,
"description": "create/update: call-to-action label (default 'Learn More')"
},
"position": {
"enum": [
"sidebar",
"banner",
"featured"
],
"type": "string",
"minLength": 1,
"description": "create/update: sidebar | banner | featured"
},
"starts_at": {
"type": "string",
"minLength": 1,
"description": "create/update: start date, YYYY-MM-DD (omit = immediately)"
}
}
}| update_type | string | post_update: release, update, feature, blog, video, announcement, milestone, listing, episode, issue |
| product_type | string | update: SaaS, Gem, Open Source, Marketplace, Tool, Platform, Agency, Studio |
| github_repo_path | string | update: GitHub repo path (e.g. 'rails/rails') |
{
"type": "object",
"required": [
"action"
],
"properties": {
"url": {
"type": "string",
"minLength": 1,
"description": "update: new product URL / post_update: link for the update"
},
"slug": {
"type": "string",
"minLength": 1,
"description": "Product slug — required for update/post_update/updates"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "update: replace product tags"
},
"title": {
"type": "string",
"minLength": 1,
"description": "post_update: update title (required for post_update)"
},
"action": {
"enum": [
"list",
"update",
"post_update",
"updates"
],
"type": "string",
"minLength": 1,
"description": "One of: list, update, post_update, updates"
},
"content": {
"type": "string",
"minLength": 1,
"description": "post_update: update body (markdown, max 10k chars)"
},
"version": {
"type": "string",
"minLength": 1,
"description": "post_update: version string for 'release' updates (e.g. '2.1.0')"
},
"description": {
"type": "string",
"minLength": 1,
"description": "update: new product description"
},
"update_type": {
"enum": [
"release",
"update",
"feature",
"blog",
"video",
"announcement",
"milestone",
"listing",
"episode",
"issue"
],
"type": "string",
"minLength": 1,
"description": "post_update: release, update, feature, blog, video, announcement, milestone, listing, episode, issue"
},
"product_type": {
"type": "string",
"minLength": 1,
"description": "update: SaaS, Gem, Open Source, Marketplace, Tool, Platform, Agency, Studio"
},
"github_repo_path": {
"type": "string",
"minLength": 1,
"description": "update: GitHub repo path (e.g. 'rails/rails')"
}
}
}{
"type": "object",
"required": [
"name",
"url",
"description"
],
"properties": {
"url": {
"type": "string",
"minLength": 1,
"description": "Product website URL (e.g. 'https://shopify.com')"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Product name (e.g. 'Shopify')"
},
"stacks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Stack names to associate (e.g. ['PostgreSQL', 'Sidekiq'])"
},
"gemfile": {
"type": "string",
"minLength": 1,
"description": "Raw Gemfile content - stacks are auto-detected and attached"
},
"importmap": {
"type": "string",
"minLength": 1,
"description": "Raw config/importmap.rb content - stacks are auto-detected and attached"
},
"description": {
"type": "string",
"minLength": 1,
"description": "Short description of the product"
},
"package_json": {
"type": "string",
"minLength": 1,
"description": "Raw package.json content - stacks are auto-detected and attached"
},
"product_type": {
"type": "string",
"minLength": 1,
"description": "Type: SaaS, Gem, Open Source, Marketplace, Tool, Platform, Agency, Studio"
}
}
}