Koskamo

BuiltOnRails MCP

BuiltOnRails MCP provides stack intelligence from real production Rails applications. It allows AI agents to search for Rails apps, compare technology stacks, get stack recommendations, detect stacks from a Gemfile, and access curated Rails ecosystem news.

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.

BuiltOnRails MCP logo, by BuiltOnRailsCommunity listingLegacy SSENo sign-inEndpoint checked 2026-11-01Published by BuiltOnRails
MCP endpoint (Legacy SSE)
https://builtonrails.com/mcp/sse
Vendor documentation

What you can do with it

  • Compare technology stacks of real Rails apps
  • Detect stacks from a Gemfile
  • Get stack recommendations
  • Search for Rails applications

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
builtonrails 1.0.0
MCP protocol
2024-11-05
Tools
18 advertised
Resources
0 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "subscribe": true,
    "listChanged": true
  }
}

Tools

18 advertised

submit_product
Advertised by the server during the last successful anonymous check.

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.

submit_product input schema
{
  "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"
    }
  }
}
submit_product annotations
{
  "title": "Submit Product",
  "readOnlyHint": false,
  "openWorldHint": false
}
search_stacks
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_stacks input schema
{
  "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"
    }
  }
}
search_stacks annotations
{
  "title": "Search Stacks",
  "readOnlyHint": true,
  "openWorldHint": false
}
search_products
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_products input schema
{
  "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_products annotations
{
  "title": "Search Products",
  "readOnlyHint": true,
  "openWorldHint": false
}
my_product
Advertised by the server during the last successful anonymous check.

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').

my_product input schema
{
  "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')"
    }
  }
}
my_product annotations
{
  "title": "My Product",
  "readOnlyHint": false,
  "openWorldHint": false
}
get_stack_trends
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_stack_trends input schema
{
  "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')"
    }
  }
}
get_stack_trends annotations
{
  "title": "Stack Trends",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_stack_recommendations
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_stack_recommendations input schema
{
  "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_stack_recommendations annotations
{
  "title": "Stack Recommendations",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_products_using_stacks
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_products_using_stacks input schema
{
  "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_products_using_stacks annotations
{
  "title": "Products Using Stacks",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_product
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get detailed information about a specific production Rails application. Returns full product details including description, tags, member, stacks, and vote count.

get_product input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "minLength": 1,
      "description": "Product slug (e.g. 'shopify', 'hey', 'github')"
    }
  }
}
get_product annotations
{
  "title": "Get Product",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_news
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_news input schema
{
  "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_news annotations
{
  "title": "Rails News",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_collection
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_collection input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "minLength": 1,
      "description": "Collection slug (e.g. 'modern-rails-2024', 'essential-saas-stack')"
    }
  }
}
get_collection annotations
{
  "title": "Get Collection",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get all available stack categories with descriptions and stack counts. Useful for understanding what types of technologies are tracked and filtering searches.

get_categories input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
get_categories annotations
{
  "title": "Get Categories",
  "readOnlyHint": true,
  "openWorldHint": false
}
detect_stacks
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

detect_stacks input schema
{
  "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"
    }
  }
}
detect_stacks annotations
{
  "title": "Detect Stacks",
  "readOnlyHint": true,
  "openWorldHint": false
}
compare_stacks
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

compare_stacks input schema
{
  "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')"
    }
  }
}
compare_stacks annotations
{
  "title": "Compare Stacks",
  "readOnlyHint": true,
  "openWorldHint": false
}
admin_sponsors
Advertised by the server during the last successful anonymous check.

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.

admin_sponsors input schema
{
  "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)"
    }
  }
}
admin_sponsors annotations
{
  "title": "Admin Sponsors",
  "readOnlyHint": false,
  "openWorldHint": false
}
admin_newsletters
Advertised by the server during the last successful anonymous check.

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.

admin_newsletters input schema
{
  "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"
    }
  }
}
admin_newsletters annotations
{
  "title": "Admin Newsletters",
  "readOnlyHint": false,
  "openWorldHint": false
}
admin_news
Advertised by the server during the last successful anonymous check.

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.

admin_news input schema
{
  "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_news annotations
{
  "title": "Admin News Review",
  "readOnlyHint": false,
  "openWorldHint": false
}
admin_moderation
Advertised by the server during the last successful anonymous check.

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).

admin_moderation input schema
{
  "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_moderation annotations
{
  "title": "Admin Moderation",
  "readOnlyHint": false,
  "openWorldHint": false
}
admin_changelog
Advertised by the server during the last successful anonymous check.

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.

admin_changelog input schema
{
  "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_changelog annotations
{
  "title": "Admin Changelog",
  "readOnlyHint": false,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

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
2382 ms
95th percentile latency
2382 ms

Maintenance history

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

  • · probe · passed · 2382 ms · metadata changed · 18 tool(s), 0 resource(s), 0 resource template(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 sse builtonrails-mcp https://builtonrails.com/mcp/sse

Cline

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

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 sse builtonrails-mcp https://builtonrails.com/mcp/sse

Let your agent find its tools

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