Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"ai",
"mcp",
"mcp-clients",
"rails",
"ruby",
"llms",
"ruby-llm"
],
"is_fork": false,
"size_kb": 14112,
"has_wiki": false,
"homepage": "https://www.rubyllm-mcp.com/",
"languages": {
"HTML": 25732,
"Ruby": 1183005,
"Shell": 131
},
"pushed_at": "2026-07-21T18:41:38Z",
"created_at": "2025-05-22T15:47:41Z",
"owner_type": "User",
"updated_at": "2026-07-21T18:34:08Z",
"description": "Full-featured MCP support for Ruby and RubyLLM—making it easy to build structured, composable LLM workflows in pure Ruby.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Ruby",
"significant_languages": [
"Ruby"
]
},
"owner": {
"blog": null,
"name": "Patrick Vice",
"type": "User",
"login": "patvice",
"company": "@Fullscript ",
"location": "Ottawa, Ontario, Canada",
"followers": 26,
"avatar_url": "https://avatars.githubusercontent.com/u/6032824?v=4",
"created_at": "2013-11-25T16:40:41Z",
"is_verified": null,
"public_repos": 49,
"account_age_days": 4621
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-07-21T18:43:11Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-02-23T19:51:47Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2025-11-11T15:00:58Z"
},
{
"tag": "v0.7.1",
"kind": "patch",
"published_at": "2025-11-06T17:56:56Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2025-11-04T02:42:53Z"
},
{
"tag": "v0.6.4",
"kind": "patch",
"published_at": "2025-11-01T16:25:54Z"
},
{
"tag": "v0.6.3",
"kind": "patch",
"published_at": "2025-10-28T19:17:48Z"
},
{
"tag": "v0.6.2",
"kind": "patch",
"published_at": "2025-10-25T00:45:53Z"
},
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2025-07-14T23:52:49Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2025-07-14T15:31:31Z"
},
{
"tag": "v0.5.1",
"kind": "patch",
"published_at": "2025-07-07T21:37:05Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2025-07-07T14:30:03Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2025-07-03T00:23:21Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2025-07-01T16:18:38Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2025-07-01T15:56:46Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2025-07-01T15:55:29Z"
}
],
"recent_commits": [
{
"oid": "29b66dd6b2cf3bfbfd37df113abb4c852fda8000",
"body": "Bump version to 1.0.1",
"is_bot": false,
"headline": "Merge pull request #150 from patvice/v1.0.1-bump",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T18:34:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ef2b914148001d2a8cdb2c5be18be4b9300328c",
"body": null,
"is_bot": false,
"headline": "bump version to 1.0.1",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T18:26:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6bbad42631d5631aa584db740f2390405dba81b1",
"body": "Disable jruby until upstream issue is fixed",
"is_bot": false,
"headline": "Merge pull request #149 from patvice/disable-jruby",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T18:22:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5d7e8a5aa9b6790f27a45d9d9ac080cbcc9dc3b",
"body": null,
"is_bot": false,
"headline": "disable jruby until upstream issue is fixed",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T18:22:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa56b53e8ef32aa4a057bb043da7a2fb458c5abe",
"body": "Fix client_secret not sent during OAuth token exchange",
"is_bot": false,
"headline": "Merge pull request #137 from plehoux/feat/client-auth-methods",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:28:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4286df2a9c06c77e572596eb111275a596e3a908",
"body": null,
"is_bot": false,
"headline": "Fix OAuth client authentication edge cases",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:24:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ccd8b33177fe55444334cfc689fee601de98a14",
"body": "…t-false-coercion\n\nFix destructiveHint/openWorldHint coerced to true when explicitly false",
"is_bot": false,
"headline": "Merge pull request #147 from rickreyhsig-wealthbox/fix/annotation-hin…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:11:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4dd9842f218fc5169ddb2675d0c560ff430860b9",
"body": "Widen json-schema dependency to allow 5.0 through 6.2.0",
"is_bot": false,
"headline": "Merge pull request #148 from luisgsilva950/widen-json-schema-dependency",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:09:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e20ca3b659d5224314cf6342c4267dfd9197a4a",
"body": "Fix TypeError on 403 OAuth error body with a string",
"is_bot": false,
"headline": "Merge pull request #146 from orthodoX/fix-oauth-403-string-error",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:08:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2f9c5c7ad9d01dc480b18e1223251b3e93e82df",
"body": "Fail pending Streamable HTTP requests on POST 405",
"is_bot": false,
"headline": "Merge pull request #145 from jstar0/fix/streamable-http-post-405-error",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-07-21T16:01:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e91025edf001089bff6421179c428b4fec94d49",
"body": null,
"is_bot": false,
"headline": "Widen json-schema dependency to allow 5.x and 6.x",
"author_name": "luisgsilva950",
"author_login": "luisgsilva950",
"committed_at": "2026-07-09T00:05:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67084b086a89a357e3511130db5e4d9acbff60c1",
"body": "Annotation#initialize used `annotation[\"key\"] || default`, which\ndiscards an explicit `false` from the server and falls back to the\ntruthy default. `fetch(key, default)` only applies the default when\nthe key is absent, so an explicit false is preserved.\n\nreadOnlyHint and idempotentHint are unaffected since their defaults\nare already false.\n\nFixes #143",
"is_bot": false,
"headline": "Fix destructiveHint/openWorldHint coerced true when explicitly false",
"author_name": "rickreyhsig-wealthbox",
"author_login": "rickreyhsig-wealthbox",
"committed_at": "2026-07-07T19:32:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5140a05c873bfbca43408cb62aa5bcc637323fe",
"body": null,
"is_bot": false,
"headline": "Fix TypeError on 403 OAuth error body with a string",
"author_name": "Slobodan Erak",
"author_login": "orthodoX",
"committed_at": "2026-06-26T13:11:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7cbdbd8adb732e23556117e3fc2bee5fc1f98f8d",
"body": null,
"is_bot": false,
"headline": "fix: fail pending Streamable HTTP requests on POST 405",
"author_name": "jstar0",
"author_login": "jstar0",
"committed_at": "2026-06-20T21:01:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f4819c0b0978093215906a886fbdc84300e3691b",
"body": "When a server returns a client_secret during dynamic registration but\nomits token_endpoint_auth_method, the gem was defaulting to \"none\" and\nsilently dropping the secret from all token requests. This breaks any\nMCP server that expects client_secret in the POST body (e.g. Canny).\n\nPer RFC 7591 §2, th\n[…]\nsic (HTTP Basic header per RFC 6749 §2.3.1)\n- token_manager: route all token requests (auth code, client creds,\n refresh) through the same auth method so the secret is always sent\n when it should be",
"is_bot": false,
"headline": "Fix client_secret not sent during OAuth token exchange",
"author_name": "Philippe Lehoux",
"author_login": "plehoux",
"committed_at": "2026-03-06T19:28:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d10851994029c7d7f3246ad517b2eef483ac810",
"body": "Solved another spec race condition with that effects JRuby",
"is_bot": false,
"headline": "Merge pull request #134 from patvice/jruby-spec-racecondition-issue",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-03-05T16:31:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "100592e0c254f83e778afa979eb173d33bab8abc",
"body": null,
"is_bot": false,
"headline": "solve another spec race condition with that effects JRuby",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T22:19:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c0e570c04d91c50bd47d7ba505f97a44835f22fd",
"body": "RubyLLM::MCP to v1! 🎉",
"is_bot": false,
"headline": "Merge pull request #132 from patvice/v1.0-bump",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T19:30:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0723eb3c48c7d5bc75b21e270a29cbabc9e49b5f",
"body": null,
"is_bot": false,
"headline": "move ruby_llm-mcp to v1! 🎉",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T17:32:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b70300dc822e8f95f011e0c2a32770f701ce006f",
"body": "New Doc Accent Colour",
"is_bot": false,
"headline": "Merge pull request #131 from patvice/new-docs-theme",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T16:58:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5f0ab564a37bf8efc9e1231cc99759ec44e5a1a",
"body": "Fix legacy OAuth discovery fallback for path-based MCP URLs",
"is_bot": false,
"headline": "Merge pull request #130 from patvice/legacy-discovery-support",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T16:51:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eec911a191da8967fa8afa6a44217e23cdf3f6f3",
"body": "…with RubyLLM::MCP",
"is_bot": false,
"headline": "changing the doc colour platte to reflect some other branding we did …",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T16:51:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "591542ab64b53dcacf0ab98ad5daa73cf47b62a2",
"body": null,
"is_bot": false,
"headline": "Fix legacy OAuth discovery fallback for path-based MCP URLs",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T15:37:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3d6386e914906a09de96867951faf9f390c0ca66",
"body": "Normalize bearer token header format",
"is_bot": false,
"headline": "Merge pull request #129 from patvice/use-B-on-bearer-token",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T14:44:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ad2db6d7a1c65644beb55061d063d7584d68112",
"body": "Fix StreamableHTTP timeouts for inline SSE POST streams (Notion)",
"is_bot": false,
"headline": "Merge pull request #124 from plehoux/fix/streamable-http-inline-sse",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T14:38:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "481665c850401d664b4bb16fe6bd479473fa7b0b",
"body": null,
"is_bot": false,
"headline": "Normalize bearer token header format",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T14:38:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf8d4e3869544cc9ee9eedda4775130737a6b49f",
"body": "Quick README.md and docs/index update",
"is_bot": false,
"headline": "Merge pull request #128 from patvice/readme-update",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T14:07:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9dbbddfd4c1ed8de88f8c228c36e5921f1201de",
"body": null,
"is_bot": false,
"headline": "readme.md and docs/index update",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T14:07:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cad06369649738d6c5edc7205f07271689add2a4",
"body": " Updated branding assets for dark mode compatibility in docs and README",
"is_bot": false,
"headline": "Merge pull request #125 from patvice/dark-mode-logo-support",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T13:55:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "29b2dc36a5855b8b741d15b90d6d53ed53ada248",
"body": null,
"is_bot": false,
"headline": "Fix callback worker logging and close-error resilience",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-23T13:38:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e373e4225e06c9c38648f90e870a8557f47c73cc",
"body": null,
"is_bot": false,
"headline": "Remove comments as per @patvice advice",
"author_name": "Philippe Lehoux",
"author_login": "plehoux",
"committed_at": "2026-02-22T23:22:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95439bdfca1b8ab1fbe125ff80a6c9685d8ebe96",
"body": null,
"is_bot": false,
"headline": "added another jruby threading fix",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T23:07:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70ab27ac393070697bc42bb6ec8639254ddeb867",
"body": null,
"is_bot": false,
"headline": "added support for darkmode and lightmode logo in the readme and the site",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T22:22:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ed68aeab29c2260ea1d7a2eabd4a0e69fe87d40",
"body": "Notion’s MCP server responds to every POST with text/event-stream and\nkeeps the stream open after sending the result. The previous synchronous\npost() blocked until operation_timeout, so wait_for_response_with_timeout\nnever ran and queued results timed out.\n\nRoute wait_for_response: true requests through a background thread + queue\nso the main thread can poll results while HTTPX processes the stream.\nKeep synchronous behavior for fire-and-forget requests.",
"is_bot": false,
"headline": "Handle inline SSE POST responses without blocking (Notion)",
"author_name": "Philippe Lehoux",
"author_login": "plehoux",
"committed_at": "2026-02-22T20:32:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f1fffc59886f9aeddb68cd2f75c901bf215e3d3",
"body": "Docs refresh: README/index rewrite, examples, and issue template",
"is_bot": false,
"headline": "Merge pull request #122 from patvice/issue-readme-update",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T19:34:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "228ad0cab47e89286ad0ea30e4bd08ff8da4b8cd",
"body": "Fix JRuby concurrency races in browser OAuth and auth storage",
"is_bot": false,
"headline": "Merge pull request #123 from patvice/jruby-spec-bug",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T19:34:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67eab9f629a636e28a6c2fd76b645fa58e30513c",
"body": null,
"is_bot": false,
"headline": "Propagate callback worker failures to auth flow",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T19:31:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dadf76d4f27c7cd3be8d7734d8d15ed00cc79ea3",
"body": null,
"is_bot": false,
"headline": "Harden JRuby concurrency in auth logging and memory storage",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T19:17:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1ebe8185e2b69249ccb80c97ae9b4892d7b3455",
"body": null,
"is_bot": false,
"headline": "Fix JRuby logger race in browser OAuth flow",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T19:01:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4b86ac5bb3aa942c231b6f209463bf07c612ba6",
"body": null,
"is_bot": false,
"headline": "docs: refresh README/docs landing and add issue template",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T18:43:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac989475e3bbd2897e7d44b8c090d0303990764e",
"body": "Fix OAuth protected-resource discovery for GitHub Copilot MCP",
"is_bot": false,
"headline": "Merge pull request #120 from patvice/protected-resource-discovery-issue",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T18:01:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67f9ab61dffade4be175e7c7a977ff92d94fb8c2",
"body": null,
"is_bot": false,
"headline": "Remove scripts test file from tracking",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T17:25:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b697e4c6e8faf17633324863fc6c92d5a57f0de",
"body": "…script",
"is_bot": false,
"headline": "Fix OAuth protected-resource discovery and sanitize Copilot verifier …",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T17:23:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67455a02f5851b67121cda665ae37b6d2d991bb3",
"body": "…response\n\nAlign token error handling and tests with RFC 6749 section 5.2",
"is_bot": false,
"headline": "Merge pull request #119 from patvice/token-manager-raise-oauth-error-…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T17:06:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28c0e28642be57c6312167d0f9837ac68f58b942",
"body": "- Parse OAuth error payloads in token refresh responses even on non-200 statuses\\n- Preserve OAuth error details (error, description, uri) in TransportError paths\\n- Keep explicit validation for missing access_token in token responses\\n- Replace non-standard test error code with RFC core code and add invalid_client 401 coverage",
"is_bot": false,
"headline": "Align token error handling and tests with RFC 6749 section 5.2",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T16:31:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e454768aa2f06c1d18089eba2c82f355b4ada408",
"body": "Extensions Support + MCP Apps",
"is_bot": false,
"headline": "Merge pull request #116 from patvice/extensions-and-mcp-apps",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-22T16:15:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6715d57a92bf75e148884b93f2d6dad346a23bac",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin' into extensions-and-mcp-apps",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T01:25:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09024eaef3fd747fc4b0be2454dac9289713bfc6",
"body": null,
"is_bot": false,
"headline": "more doc site improvments and fix example rubocop errors",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T01:24:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69cefb85dd95e2cdd7ad433b4ba21b35d32e4670",
"body": "Expand Ruby Version in CI",
"is_bot": false,
"headline": "Merge pull request #115 from patvice/expand-ruby-version-coverage-in-ci",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T00:30:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b373ce57d82f2f6e6d28f4b5320445759cc2348a",
"body": null,
"is_bot": false,
"headline": "Merge origin/main into extensions-and-mcp-apps",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T00:27:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11b598273b4f5f55b51bdd0f1446c1ba5e13630b",
"body": null,
"is_bot": false,
"headline": "Fix JRuby race conditions in auth, stdio, and SSE flows",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T00:27:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e38f7d04a8ef7670bf9818362f1d9cde373ced3b",
"body": "…cs rewrite",
"is_bot": false,
"headline": "working execution of extensions and mcp apps spec implementation + do…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-17T00:22:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "613c622d802a784c2cc1a8ce7cb3350439d91b2e",
"body": null,
"is_bot": false,
"headline": "Split RuboCop into dedicated Ruby 4.0 CI job",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:57:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05b183dd2b8e6225dd2309bc62a3a9dc0855e2bb",
"body": null,
"is_bot": false,
"headline": "Fix RuboCop indentation in JRuby retry guard",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:50:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9fceb4ea96641a7d6458cbea0a09ab48fff7030b",
"body": null,
"is_bot": false,
"headline": "Stabilize flaky JRuby specs for promise and streamable sampling",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:48:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3381e4228e171558e0a442063e1924b96a751c5e",
"body": null,
"is_bot": false,
"headline": "Fix RuboCop offenses in cancellation integration spec",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:45:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89a4375cf0265aafaf5d49329547bdb0c113ddbc",
"body": null,
"is_bot": false,
"headline": "Stabilize cancellation integration timing on JRuby",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:42:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "195d45873bc59a0b0bbd265aa0fdcb3748ec1ba5",
"body": null,
"is_bot": false,
"headline": "Wait for sampling tool availability in integration spec",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:37:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "80e8f234fc7ce8653db0f946ae34724415995ee8",
"body": null,
"is_bot": false,
"headline": "Make debug require optional in spec helper",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:34:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6bf8d4e5f82e3b0a5098c8470020b6a0a1614106",
"body": null,
"is_bot": false,
"headline": "Limit debug gem to MRI for JRuby compatibility",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:32:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8d8fbf1046f9df3b81a4cd5bb58173a9e6ce7032",
"body": null,
"is_bot": false,
"headline": "reduce patch level pin on jruby in ci",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:28:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "53696b9347f0a7449e2ce4e8f6b5cda9055ec9e9",
"body": null,
"is_bot": false,
"headline": "added ruby 4.0 and jruby version to ci",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:25:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00ceff0121cb3080ebb4f3afaf1043e569b74ebc",
"body": "Add MCP 2025-11-25 support with tasks + schema updates",
"is_bot": false,
"headline": "Merge pull request #114 from patvice/spec-2025-11-25-support",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T23:21:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b58f140028b033206e40dc73d635b469095eeadb",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin' into spec-2025-11-25-support",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T20:10:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7166aec3c8e5e34d00c111a4b2c730f333995a9",
"body": "…l support",
"is_bot": false,
"headline": "corrected elicitation issue, and added smoke test concept for protoco…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T20:08:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "100c54b17f50f45ecb9ad7535a92612fe6c58950",
"body": "Bump MCP gem to v0.7 and align adapter behavior",
"is_bot": false,
"headline": "Merge pull request #113 from patvice/codex/mcp-v0-7-parity",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T19:48:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8d6dbce2e287607626b2d96a1999a8db080d742",
"body": null,
"is_bot": false,
"headline": "feat: support MCP 2025-11-25 tasks and schema updates",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T19:37:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5b7cf627fe03381febc1765bddb7b78e927ce9e",
"body": null,
"is_bot": false,
"headline": "Fix MCP SDK prompt error wrapping and optional spec gating",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T18:39:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37635950c8f4e8349581d58c29cc8b9ba483660a",
"body": null,
"is_bot": false,
"headline": "Fix RuboCop empty line after guard clause",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:52:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9d60ba0df4f730cabd3eb9c6d94168e321219ad",
"body": "Handle HTTP 201 responses in StreamableHTTP transport",
"is_bot": false,
"headline": "Merge pull request #112 from patvice/codex/issue-107-streamable-http-201",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:47:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e34d8ad1903f1ab89cb55e29498af7435b7725f",
"body": null,
"is_bot": false,
"headline": "Bump MCP gem to v0.7 and align adapter parity",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:45:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "345225e0c2d84f461e59c8bb9482e00df5ff5099",
"body": null,
"is_bot": false,
"headline": "Remove 204 POST handling from streamable responses",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:37:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2f0f2b279544aac406447c364f711106687c06f",
"body": null,
"is_bot": false,
"headline": "Handle 204 no-content responses safely",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:31:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1066891ab427159246350b8d8c708af150d100f3",
"body": null,
"is_bot": false,
"headline": "Handle HTTP 201 success in streamable transport",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:26:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1204acc7058bd39a8e43ac2b64545f766334ba30",
"body": "Client Interactions: Response Handler Pattern",
"is_bot": false,
"headline": "Merge pull request #110 from patvice/response-handler-pattern",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:21:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f136ab3810ce025b4ff7f5e481b895f5a06a0420",
"body": null,
"is_bot": false,
"headline": "Fix all RuboCop offenses",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:18:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e2ea892cc7887c32d62ef63ed5ab334326e70bb",
"body": null,
"is_bot": false,
"headline": "missed an instance of RateLimit to RateLimiter",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:15:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "680a23ebbbd4422283dee6b86aeb276801b5c49c",
"body": null,
"is_bot": false,
"headline": "updated name for ratelimiter class",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:13:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f1e15227922b6b389cd9887f5f32fc1b22b28a6",
"body": "…-106\n\nSanitize MCP tool names to avoid invalid provider tool ids",
"is_bot": false,
"headline": "Merge pull request #111 from patvice/codex/fix-tool-name-sanitization…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T17:09:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48a4636fb38514b9c0b37be1b0c53d372a881cca",
"body": null,
"is_bot": false,
"headline": "Sanitize MCP tool names for provider compatibility",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:55:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c7fd695f95fede65932f6a1559b99b5a0e4a7457",
"body": null,
"is_bot": false,
"headline": "updated docs for our client response handler change",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d33bd20a600b60674cd8b9bdedf1ee5d7bf2f2be",
"body": null,
"is_bot": false,
"headline": "docs: add client handler getting-started guide",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc3201528cd12aaffefb8caf1c30b1eb021ab127",
"body": "…nc registry, timeout-safe deferred decisions, explicit cancellation outcomes, and expanded TS e2e coverage",
"is_bot": false,
"headline": "enforce structured human-in-the-loop approvals with client-scoped asy…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc53368c762d78749a2e4dc8f74329a7431b8320",
"body": null,
"is_bot": false,
"headline": "passing specs and lints",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bdc0bfd50768fdd83fac3db3a588da6eaa0cea77",
"body": "…doing everything in blocks",
"is_bot": false,
"headline": "first pass on implementing handlers classes for responses instead of …",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:51:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77d042779bcdbeea7d5a26342564e86a187e2f0f",
"body": "…ss-server\n\nDisable repeated SSE fallback on 405 and align termination statuses",
"is_bot": false,
"headline": "Merge pull request #109 from patvice/disable-sse-streaming-on-statele…",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:48:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "511ea8d1512b74c4520b558a2c0ca18070c009ee",
"body": null,
"is_bot": false,
"headline": "Fix CI RuboCop offenses under newer lint version",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:46:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7af25f0a346e4fa045135175b3fedb7592e7980",
"body": null,
"is_bot": false,
"headline": "Use verified HTTPX session double in OAuth spec",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:39:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "faf3d3e195792459daf6c13f9d8217d126e3ab66",
"body": null,
"is_bot": false,
"headline": "Fix OAuth HTTPX timeout key for 1.7 compatibility",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T16:34:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b773b29979b74b3c4f8666da4e69e03cfced2b92",
"body": null,
"is_bot": false,
"headline": "Refine streamable HTTP SSE fallback and termination handling",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2026-02-16T15:05:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0236731499c86016386be053492b38054707b313",
"body": "OAuth Broswer Pages Cleanup",
"is_bot": false,
"headline": "Merge pull request #101 from patvice/oauth-broswer-page-cleanup",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T13:59:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb50f9b852b6c62f88181196c6c3d1449d577038",
"body": "Support correct stop response coming from ruby llm message",
"is_bot": false,
"headline": "Merge pull request #102 from patvice/sample-correct-stop-response",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T13:58:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2296fdcb8eb36e298685802880caec6d96ff7c14",
"body": null,
"is_bot": false,
"headline": "support correct stop response coming from ruby llm message",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T02:23:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63f43c4fcacb0b8dfb803e16700f738ecb7c8097",
"body": null,
"is_bot": false,
"headline": "move the ruby llm logo to the top corner",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T01:58:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5e9b4f7af9d267195e22012d336c1710e9fa9a0",
"body": "Full Cancelation Notification Support",
"is_bot": false,
"headline": "Merge pull request #100 from patvice/cancelation-notification-support",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T01:51:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "693ff0785632d49ad9196ea6775a719e8fd05f1a",
"body": "RPC Message Refactor + JSON RPC Error Codes",
"is_bot": false,
"headline": "Merge pull request #99 from patvice/rpc-message-refactor",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T01:51:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7634cfcd539248a41862b02b315cd9f5552346b7",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/main' into rpc-message-refactor",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-25T01:49:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b067fc47d9c5b7fd4e94970075efac5595fcc13f",
"body": "Harden transports and improve lifecycle handling",
"is_bot": false,
"headline": "Merge pull request #98 from patvice/harden-transports",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-24T20:53:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b0c6b5cf587df833b485554ac0d373f39006180",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/main' into harden-transports",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-24T20:48:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92d4f4cd4f3369d80c79dcd5dd68899e99198959",
"body": "OAuth challenge handling with automatic retry",
"is_bot": false,
"headline": "Merge pull request #97 from patvice/oauth-challenge-handling",
"author_name": "Patrick Vice",
"author_login": "patvice",
"committed_at": "2025-11-24T20:30:07Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 16,
"commits_last_year": 186,
"latest_release_at": "2026-07-21T18:43:11Z",
"latest_release_tag": "v1.0.1",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 13,
"days_since_latest_release": 0,
"mean_days_between_releases": 41.3
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "ruby_llm-mcp",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "rubygems",
"matches_repo": true,
"registry_url": "https://rubygems.org/gems/ruby_llm-mcp",
"is_deprecated": false,
"latest_version": "1.0.1",
"repository_url": "https://github.com/patvice/ruby_llm-mcp",
"versions_count": 21,
"total_downloads": 195517,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": "2025-05-22T19:26:33.174000Z",
"latest_published_at": "2026-07-21T18:41:46.162000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 29,
"stars": 254,
"watchers": 4,
"fork_history": {
"days": [
{
"date": "2025-05-28",
"count": 1
},
{
"date": "2025-06-03",
"count": 1
},
{
"date": "2025-06-11",
"count": 1
},
{
"date": "2025-06-17",
"count": 1
},
{
"date": "2025-06-19",
"count": 1
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-30",
"count": 1
},
{
"date": "2025-07-01",
"count": 1
},
{
"date": "2025-07-08",
"count": 2
},
{
"date": "2025-07-15",
"count": 1
},
{
"date": "2025-08-04",
"count": 1
},
{
"date": "2025-09-26",
"count": 1
},
{
"date": "2025-10-20",
"count": 1
},
{
"date": "2025-10-30",
"count": 1
},
{
"date": "2025-11-04",
"count": 1
},
{
"date": "2025-12-23",
"count": 1
},
{
"date": "2026-02-05",
"count": 1
},
{
"date": "2026-02-12",
"count": 1
},
{
"date": "2026-02-22",
"count": 1
},
{
"date": "2026-02-24",
"count": 2
},
{
"date": "2026-05-30",
"count": 1
},
{
"date": "2026-06-20",
"count": 1
},
{
"date": "2026-06-23",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-07-07",
"count": 1
},
{
"date": "2026-07-08",
"count": 1
},
{
"date": "2026-07-11",
"count": 1
}
],
"complete": true,
"collected": 29,
"total_forks": 29
},
"star_history": {
"days": [
{
"date": "2025-05-24",
"count": 1
},
{
"date": "2025-05-25",
"count": 1
},
{
"date": "2025-05-27",
"count": 2
},
{
"date": "2025-05-31",
"count": 1
},
{
"date": "2025-06-01",
"count": 1
},
{
"date": "2025-06-02",
"count": 1
},
{
"date": "2025-06-03",
"count": 2
},
{
"date": "2025-06-04",
"count": 1
},
{
"date": "2025-06-05",
"count": 1
},
{
"date": "2025-06-06",
"count": 2
},
{
"date": "2025-06-10",
"count": 1
},
{
"date": "2025-06-11",
"count": 25
},
{
"date": "2025-06-12",
"count": 13
},
{
"date": "2025-06-13",
"count": 1
},
{
"date": "2025-06-14",
"count": 1
},
{
"date": "2025-06-16",
"count": 1
},
{
"date": "2025-06-17",
"count": 2
},
{
"date": "2025-06-18",
"count": 2
},
{
"date": "2025-06-19",
"count": 1
},
{
"date": "2025-06-22",
"count": 1
},
{
"date": "2025-06-23",
"count": 2
},
{
"date": "2025-06-25",
"count": 2
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-30",
"count": 1
},
{
"date": "2025-07-01",
"count": 1
},
{
"date": "2025-07-02",
"count": 1
},
{
"date": "2025-07-03",
"count": 1
},
{
"date": "2025-07-07",
"count": 1
},
{
"date": "2025-07-08",
"count": 1
},
{
"date": "2025-07-09",
"count": 6
},
{
"date": "2025-07-10",
"count": 2
},
{
"date": "2025-07-14",
"count": 2
},
{
"date": "2025-07-15",
"count": 7
},
{
"date": "2025-07-16",
"count": 6
},
{
"date": "2025-07-18",
"count": 1
},
{
"date": "2025-07-21",
"count": 3
},
{
"date": "2025-07-22",
"count": 1
},
{
"date": "2025-07-23",
"count": 5
},
{
"date": "2025-07-26",
"count": 1
},
{
"date": "2025-07-28",
"count": 2
},
{
"date": "2025-08-01",
"count": 1
},
{
"date": "2025-08-02",
"count": 1
},
{
"date": "2025-08-03",
"count": 2
},
{
"date": "2025-08-04",
"count": 1
},
{
"date": "2025-08-05",
"count": 1
},
{
"date": "2025-08-06",
"count": 1
},
{
"date": "2025-08-07",
"count": 1
},
{
"date": "2025-08-09",
"count": 5
},
{
"date": "2025-08-10",
"count": 1
},
{
"date": "2025-08-12",
"count": 2
},
{
"date": "2025-08-13",
"count": 2
},
{
"date": "2025-08-14",
"count": 1
},
{
"date": "2025-08-16",
"count": 1
},
{
"date": "2025-08-18",
"count": 1
},
{
"date": "2025-08-24",
"count": 2
},
{
"date": "2025-08-25",
"count": 3
},
{
"date": "2025-08-30",
"count": 1
},
{
"date": "2025-09-02",
"count": 1
},
{
"date": "2025-09-05",
"count": 3
},
{
"date": "2025-09-06",
"count": 1
},
{
"date": "2025-09-10",
"count": 1
},
{
"date": "2025-09-14",
"count": 1
},
{
"date": "2025-09-15",
"count": 2
},
{
"date": "2025-09-16",
"count": 1
},
{
"date": "2025-09-22",
"count": 1
},
{
"date": "2025-09-24",
"count": 2
},
{
"date": "2025-09-25",
"count": 1
},
{
"date": "2025-09-26",
"count": 2
},
{
"date": "2025-09-27",
"count": 1
},
{
"date": "2025-10-02",
"count": 1
},
{
"date": "2025-10-08",
"count": 2
},
{
"date": "2025-10-09",
"count": 1
},
{
"date": "2025-10-13",
"count": 1
},
{
"date": "2025-10-16",
"count": 2
},
{
"date": "2025-10-18",
"count": 2
},
{
"date": "2025-10-22",
"count": 1
},
{
"date": "2025-10-26",
"count": 1
},
{
"date": "2025-10-28",
"count": 2
},
{
"date": "2025-10-29",
"count": 1
},
{
"date": "2025-10-30",
"count": 1
},
{
"date": "2025-11-03",
"count": 2
},
{
"date": "2025-11-04",
"count": 3
},
{
"date": "2025-11-05",
"count": 3
},
{
"date": "2025-11-06",
"count": 1
},
{
"date": "2025-11-10",
"count": 2
},
{
"date": "2025-11-11",
"count": 1
},
{
"date": "2025-11-15",
"count": 2
},
{
"date": "2025-11-16",
"count": 2
},
{
"date": "2025-11-17",
"count": 1
},
{
"date": "2025-11-18",
"count": 3
},
{
"date": "2025-11-19",
"count": 2
},
{
"date": "2025-11-21",
"count": 1
},
{
"date": "2025-11-26",
"count": 1
},
{
"date": "2025-12-01",
"count": 1
},
{
"date": "2025-12-03",
"count": 1
},
{
"date": "2025-12-08",
"count": 1
},
{
"date": "2025-12-09",
"count": 1
},
{
"date": "2025-12-13",
"count": 1
},
{
"date": "2025-12-15",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2025-12-22",
"count": 1
},
{
"date": "2025-12-23",
"count": 2
},
{
"date": "2025-12-26",
"count": 1
},
{
"date": "2025-12-27",
"count": 2
},
{
"date": "2025-12-31",
"count": 1
},
{
"date": "2026-01-13",
"count": 1
},
{
"date": "2026-01-15",
"count": 1
},
{
"date": "2026-01-22",
"count": 1
},
{
"date": "2026-01-30",
"count": 1
},
{
"date": "2026-02-20",
"count": 2
},
{
"date": "2026-02-21",
"count": 1
},
{
"date": "2026-02-24",
"count": 7
},
{
"date": "2026-02-25",
"count": 4
},
{
"date": "2026-02-28",
"count": 1
},
{
"date": "2026-03-01",
"count": 2
},
{
"date": "2026-03-02",
"count": 1
},
{
"date": "2026-03-10",
"count": 1
},
{
"date": "2026-03-11",
"count": 1
},
{
"date": "2026-03-21",
"count": 1
},
{
"date": "2026-03-22",
"count": 1
},
{
"date": "2026-03-27",
"count": 1
},
{
"date": "2026-04-01",
"count": 1
},
{
"date": "2026-04-04",
"count": 1
},
{
"date": "2026-04-09",
"count": 1
},
{
"date": "2026-04-16",
"count": 2
},
{
"date": "2026-04-20",
"count": 1
},
{
"date": "2026-04-21",
"count": 2
},
{
"date": "2026-05-09",
"count": 1
},
{
"date": "2026-05-12",
"count": 1
},
{
"date": "2026-05-14",
"count": 1
},
{
"date": "2026-05-16",
"count": 1
},
{
"date": "2026-05-17",
"count": 1
},
{
"date": "2026-05-29",
"count": 1
},
{
"date": "2026-06-09",
"count": 1
},
{
"date": "2026-06-10",
"count": 1
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-23",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-29",
"count": 1
},
{
"date": "2026-07-01",
"count": 1
},
{
"date": "2026-07-03",
"count": 1
}
],
"complete": true,
"collected": 254,
"total_stars": 254
},
"open_issues_and_prs": 6
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"examples/mcp_app/test_server/tsconfig.json",
"spec/fixtures/pagination-server/tsconfig.json",
"spec/fixtures/typescript-mcp/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 85661,
"source_files_sampled": 251,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"Gemfile",
"docs/Gemfile"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"rubygems"
],
"dependencies": [
{
"name": "activesupport",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "bundler",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": ">= 2.0"
},
{
"name": "debug",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "dotenv",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": ">= 3.0"
},
{
"name": "json_schemer",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "rake",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": ">= 13.0"
},
{
"name": "rdoc",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 6.15"
},
{
"name": "reline",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "rspec",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 3.12"
},
{
"name": "rubocop",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 1.84.2"
},
{
"name": "rubocop-rake",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 0.7.1"
},
{
"name": "rubocop-rspec",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 3.9.0"
},
{
"name": "simplecov",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "vcr",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "webmock",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": "~> 3.25"
},
{
"name": "fast-mcp",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "puma",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
},
{
"name": "rack",
"manifest": "Gemfile",
"ecosystem": "rubygems",
"version_constraint": null
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 97,
"open_issues": 5,
"closed_ratio": 0.889,
"closed_issues": 40,
"closed_unmerged_prs": 7
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "patvice",
"commits": 354,
"avatar_url": "https://avatars.githubusercontent.com/u/6032824?v=4"
},
{
"type": "User",
"login": "parruda",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/2799560?v=4"
},
{
"type": "User",
"login": "scald",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/1215913?v=4"
},
{
"type": "User",
"login": "MadBomber",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/21101?v=4"
},
{
"type": "User",
"login": "plehoux",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/129220?v=4"
},
{
"type": "User",
"login": "davidemerli",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/53702616?v=4"
},
{
"type": "User",
"login": "ericproulx",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/8418467?v=4"
},
{
"type": "User",
"login": "josh-m-sharpe",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/39473?v=4"
},
{
"type": "User",
"login": "orthodoX",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/370935?v=4"
},
{
"type": "User",
"login": "trevorturk",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/402?v=4"
}
],
"contributors_sampled": 13,
"top_contributor_share": 0.937
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"cicd.yml",
"docs.yml"
],
"has_docs_dir": true,
"linter_configs": [
".rubocop.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 3,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 7,
"reason": "11 out of 15 merged PRs checked by a CI test -- score normalized to 7",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 4,
"reason": "Found 6/15 approved changesets -- score normalized to 4",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 6,
"reason": "project has 2 contributing companies or organizations -- score normalized to 6",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "14 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "51 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "29b66dd6b2cf3bfbfd37df113abb4c852fda8000",
"ran_at": "2026-07-21T18:44:58Z",
"aggregate_score": 3.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/patvice/ruby_llm-mcp",
"host": "github.com",
"name": "ruby_llm-mcp",
"owner": "patvice"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 67,
"inputs": {
"security": 39,
"vitality": 84,
"community": 56,
"governance": 64,
"engineering": 83
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 84,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 73,
"inputs": {
"commits_last_year": 186,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 13
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "13/52 weeks with commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 13
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "186 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 186
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "14 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 16,
"latest_release_tag": "v1.0.1",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 41.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "16 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 16
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~41.3 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 41.3
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 56,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"forks": 29,
"stars": 254,
"watchers": 4,
"growth_state": "organic",
"growth_factor_pct": 100
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "254 stars",
"points": 39,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 254
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "29 forks",
"points": 12.1,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 29
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "4 watchers",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 4
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 69,
"inputs": {
"packages": [
"ruby_llm-mcp"
],
"dependents": null,
"ecosystems": "rubygems",
"total_downloads": 195517,
"monthly_downloads": null
},
"components": [
{
"key": "total_downloads",
"name": "Total downloads",
"detail": "195,517 downloads all-time across rubygems",
"points": 55,
"status": "partial",
"details": [
{
"code": "downloads_total",
"params": {
"count": 195517,
"ecosystems": "rubygems"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 64,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 30,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 13,
"top_contributor_share": 0.937
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 94% of commits",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 94
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "13 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 13
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 6,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"merged_prs": 97,
"open_issues": 5,
"closed_issues": 40,
"issue_closed_ratio": 0.889,
"closed_unmerged_prs": 7
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "89% of issues closed",
"points": 41.6,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 89
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "97/104 decided PRs merged",
"points": 35.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 97,
"decided": 104
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 6/15 approved changesets -- score normalized to 4",
"points": 6,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"followers": 26,
"owner_type": "User",
"is_verified": null,
"owner_login": "patvice",
"public_repos": 49,
"account_age_days": 4621
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "26 followers of patvice",
"points": 10.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 26,
"login": "patvice"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "49 public repos, account ~12 yr old",
"points": 24.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 49
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"ruby_llm-mcp"
],
"ecosystems": "rubygems",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on rubygems",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "rubygems"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "21 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 21
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 83,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".rubocop.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".rubocop.yml"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "11 out of 15 merged PRs checked by a CI test -- score normalized to 7",
"points": 14,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"ai",
"mcp",
"mcp-clients",
"rails",
"ruby",
"llms",
"ruby-llm"
],
"has_wiki": false,
"homepage": "https://www.rubyllm-mcp.com/",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://www.rubyllm-mcp.com/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "7 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 7
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 39,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 39,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 3.9
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "11 out of 15 merged PRs checked by a CI test -- score normalized to 7",
"points": 1.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 6/15 approved changesets -- score normalized to 4",
"points": 3,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "14 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "51 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 10
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 50,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "critical",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.42,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "42 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 22.4,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 42,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"examples/mcp_app/test_server/tsconfig.json",
"spec/fixtures/pagination-server/tsconfig.json",
"spec/fixtures/typescript-mcp/tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": ".rubocop.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".rubocop.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "examples/mcp_app/test_server/tsconfig.json, spec/fixtures/pagination-server/tsconfig.json, spec/fixtures/typescript-mcp/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples/mcp_app/test_server/tsconfig.json, spec/fixtures/pagination-server/tsconfig.json, spec/fixtures/typescript-mcp/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "good",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"primary_language": "Ruby",
"largest_source_bytes": 85661,
"source_files_sampled": 251,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Ruby with type-check config (examples/mcp_app/test_server/tsconfig.json, spec/fixtures/pagination-server/tsconfig.json, spec/fixtures/typescript-mcp/tsconfig.json)",
"points": 27,
"status": "partial",
"details": [
{
"code": "typecheck_config_language",
"params": {
"files": "examples/mcp_app/test_server/tsconfig.json, spec/fixtures/pagination-server/tsconfig.json, spec/fixtures/typescript-mcp/tsconfig.json",
"language": "Ruby"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/251 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 251,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "moderate",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-21T18:45:19.170247Z",
"schema_version": "0.23.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/patvice/ruby_llm-mcp.svg",
"full_name": "patvice/ruby_llm-mcp",
"license_state": "standard",
"license_spdx": "MIT"
}