Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 03:41 UTC

RedberryProducts / mcp-client-laravel

Laravel-native client for Model Context Protocol (MCP) servers. Built by Redberry (Diamond-tier Laravel partner). Used by LarAgent and other frameworks to enable AI agent functionality.

PHPMIT★ 13 stars⑂ 3 forkssince Jun 2025View on GitHub ↗

RedberryProducts/mcp-client-laravel holds a health index of 60 out of 100, placing it in the Moderate band. It scores highest on Vitality (75/100) and lowest on Community & Adoption (47/100). It was last updated 30 days ago. A single contributor accounts for most of its recent work.

60
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

60
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

RedberryOrganization
38 followers37 public repossince Mar 2020

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
Packagistredberry/mcp-client-laravelv2.0.0-rc.116,084477 days agolaravelredberrymcp-client-laravel

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

75Good · 22% of overall
How it's scored
28.8/36Push recency — last push 30 days ago
7.6/36Commit cadence — 11/52 weeks with commits
18/18Commit volume — 131 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year131
human_commit_share0.96
days_since_last_push30
active_weeks_last_year11
How it's scored
27/27Ships releases — 3 releases published
36/36Release recency — latest release 74 days ago
19.8/27Release cadence — a release every ~110.4 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count3
latest_release_tagv1.1.1
releases_from_tagsno
days_since_latest_release74
mean_days_between_releases110.4
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

47At risk · 18% of overall
How it's scored
17.5/60Stars — 13 stars
2.5/25Forks — 3 forks
0/15Watchers — 0 watchers
Inputs used
forks3
stars13
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
56.1/80Monthly downloads — 16,084 downloads/month across packagist
2/20Registry dependents — 1 packages depend on it
Inputs used
packagesredberry/mcp-client-laravel
dependents1
ecosystemspackagist
total_downloads99,674
monthly_downloads16,084

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

57Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
1.8/22.5Commit distribution — top contributor authored 92% of commits
2.7/13.5Contributor breadth — 2 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.918
How it's scored
38.2/46.8Issue resolution — 82% of issues closed
33/38.3PR acceptance — 38/44 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/8 approved changesets -- score normalized to 0
Inputs used
merged_prs38
open_issues2
closed_issues9
issue_closed_ratio0.818
closed_unmerged_prs6
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
11.4/25Owner reach — 38 followers of RedberryProducts
23.5/25Track record — 37 public repos, account ~6 yr old
Inputs used
followers38
owner_typeOrganization
is_verified
owner_loginRedberryProducts
public_repos37
account_age_days2,316
How it's scored
25/25Published & resolvable — 1 package(s) on packagist
35/35Publish recency — latest publish 77 days ago
12/20Version history — 4 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesredberry/mcp-client-laravel
ecosystemspackagist
any_deprecatedno
min_days_since_publish77

Engineering Quality

Are baseline engineering and documentation practices in place?

66Moderate · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
6.4/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 7 out of 8 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configno
has_precommit_configno

Documentation

60Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 17 topics
10/10Wiki
Inputs used
topicsagent-integration, ai-agents, ai-framework, chatbot, context, laravel, laravel-ai, laravel-package, llm, mcp, mcp-client, memory, openai, php, prompt-engineering, redberry, tools
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

52Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2/2.5CI-Tests — 7 out of 8 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/8 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — no data
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate5.1
Excluded from scoring (no data or not applicable): dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.

AI Readiness

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.

59Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
37.2/40Legible commit history — 67 of 96 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.698
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes8,601
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
0/11Static type checking
0/10Reproducible environment
10/10Demonstrated agent practice — 31 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 4 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.31
toolchain_manifests
dependency_bot_commit_share0.04
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
0/45Type-checkable code — PHP without a type-check config
55/55Manageable file sizes — 0/27 source files over 60KB
Inputs used
primary_languagePHP
largest_source_bytes39,957
source_files_sampled27
oversized_source_files0

Key facts

13GitHub stars
2contributors
131commits, last 12 months
30days since last push
3releases
1bus factor
2open issues
Packagistpackage ecosystems

Data collection warnings

  • No resolved dependencies carried a version and a supported ecosystem

More detail

Star and fork history 13 ★ / 3 ⇿
13Stars
3Forks
2Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0358101315133102025-072025-122026-04
Major 1Minor 1Patch 0
OpenSSF Scorecard 5.1 / 10
5.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 03:41 UTC

10Binary-Artifactsno binaries found in the repo
1Branch-Protectionbranch protection is not maximal on development and all release branches
8CI-Tests7 out of 8 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/8 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
n/aDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 4
RegistryPackageVersion constraintManifest
Packagistguzzlehttp/guzzle^7.5composer.json
Packagistilluminate/contracts^10.0||^11.0||^12.0||^13.0composer.json
Packagistpsr/http-message^1.1||^2.0composer.json
Packagistspatie/laravel-package-tools^1.16composer.json
All dependencies 15

Full resolved dependency set from the GitHub dependency graph: 4 direct and 11 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Packagistguzzlehttp/guzzledirect
Packagistilluminate/contractsdirect
Packagistpsr/http-messagedirect
Packagistspatie/laravel-package-toolsdirect
Packagistlarastan/larastanindirect
Packagistlaravel/pintindirect
Packagistnunomaduro/collisionindirect
Packagistorchestra/testbenchindirect
Packagistpestphp/pestindirect
Packagistpestphp/pest-plugin-archindirect
Packagistpestphp/pest-plugin-laravelindirect
Packagistphpindirect
Packagistphpstan/extension-installerindirect
Packagistphpstan/phpstan-deprecation-rulesindirect
Packagistphpstan/phpstan-phpunitindirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "agent-integration",
        "ai-agents",
        "ai-framework",
        "chatbot",
        "context",
        "laravel",
        "laravel-ai",
        "laravel-package",
        "llm",
        "mcp",
        "mcp-client",
        "memory",
        "openai",
        "php",
        "prompt-engineering",
        "redberry",
        "tools"
      ],
      "is_fork": false,
      "size_kb": 277,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "PHP": 137878,
        "Shell": 192
      },
      "pushed_at": "2026-06-22T03:33:25Z",
      "created_at": "2025-06-27T07:01:20Z",
      "owner_type": "Organization",
      "updated_at": "2026-05-05T17:26:09Z",
      "description": "Laravel-native client for Model Context Protocol (MCP) servers. Built by Redberry (Diamond-tier Laravel partner). Used by LarAgent and other frameworks to enable AI agent functionality.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": "https://redberry.international",
      "name": "Redberry",
      "type": "Organization",
      "login": "RedberryProducts",
      "company": null,
      "location": "Georgia",
      "followers": 38,
      "avatar_url": "https://avatars.githubusercontent.com/u/62336935?v=4",
      "created_at": "2020-03-18T11:55:17Z",
      "is_verified": null,
      "public_repos": 37,
      "account_age_days": 2316
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2026-05-08T10:57:33Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2025-11-07T11:07:36Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-09-29T13:26:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b0db4abafa26c1a16d515e397fbb9b6075fdfca5",
          "body": "docs: prepare v2.0.0 release",
          "is_bot": false,
          "headline": "Merge pull request #54 from RedberryProducts/docs/upgrade-guide-1x-to-2x",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T17:26:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ad950ee90004081876b55b89fa08f073e2b8122",
          "body": "Promote the Unreleased section to v2.0.0 with today's date.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: cut v2.0.0 in CHANGELOG",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T17:22:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19b6b56e1cefe5b3e99b2032a32b7efd55f9593e",
          "body": "ARCHITECTURE.md:\n- Drop the \"Known gaps\" sections that all describe shipped work (P0–P5).\n- Replace with \"Session loss recovery\" and \"SSE read timeout\" subsections\n  that describe the current behavior on the HTTP transport.\n- Fix STDIO lifecycle diagram defaults (50ms→100ms, 10ms→20ms, 3s→30s)\n  and\n[…]\n Collection match key) to Completed with their PR links.\n- Update lead sentence to \"All P0–P10 items have shipped, cut as v2.0.0.\"\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh ARCHITECTURE and ROADMAP for v2.0.0",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T17:22:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e72a9ee3fb64504458bb1b5681eaaec5a2c327ae",
          "body": null,
          "is_bot": false,
          "headline": "Docs: Enhance readme",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T17:12:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fbb7e4a4a80a4192b5fa119c7742a153c35e048",
          "body": "Captures the breaking changes since v1.1.0 (immutable connect, singleton\nbinding, STDIO timeout split, env inheritance, SSE read timeout) as\ncopy-pasteable before/after recipes, and links it from README + CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add 1.x → 2.x upgrade guide",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T17:03:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9aa2aaa75702daee1fc0aa20fbfbb2708d401077",
          "body": "…-support\n\nchore: support Laravel 13 and PHP 8.5",
          "is_bot": false,
          "headline": "Merge pull request #53 from RedberryProducts/chore/laravel-13-php-8.5…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T14:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f38dec6d0753b0e09dced78dc2f9eb755879670",
          "body": "Was an unused dev convenience inherited from the Spatie skeleton — the\npackage itself never calls ray() (the arch test in tests/ArchTest.php\nforbids it). Newer spatie/laravel-ray (1.43.x) was triggering a\nBindingResolutionException (\"Unresolvable dependency resolving\n[Parameter #0 [ <required> array\n[…]\ner-stable jobs. Removing the\ndependency removes that whole class of failure with no functional\nimpact on the package or its tests.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: drop spatie/laravel-ray from dev deps",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T14:21:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19b86c7a66b433e7f70890531ed96a5671ceb772",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T14:11:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bde764ec52d77d43119bd58ae910c1693635d79f",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into chore/laravel-13-php-8.5-support",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T14:08:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07d408b63f4d6c249692cd71733d609730ce97be",
          "body": "* `composer.json`:\n  * `php` widened to `^8.3 || ^8.4 || ^8.5`.\n  * `illuminate/contracts` widened to `^10.0 || ^11.0 || ^12.0 || ^13.0`\n    (L10 kept in constraints for user transitions; not in CI).\n  * `orchestra/testbench` widened to\n    `^8.22.0 || ^9.0.0 || ^10.0.0 || ^11.0.0`.\n  * `larastan/la\n[…]\nanges — `bin/check` (Pint + PHPStan + 123 Pest\ntests) is green on Laravel 13.7.0, Pest 4.7.0, Larastan 3.9.6, and\nPHP 8.4 locally.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: support Laravel 13 and PHP 8.5",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T14:05:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b982dce61156af07e59dbe21aa403f6e4f02229",
          "body": "refactor(client): MCPClient surface — singleton DI, immutable connect, missing guards (P7, fixes #48)",
          "is_bot": false,
          "headline": "Merge pull request #52 from RedberryProducts/refactor/mcp-client-surface",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:58:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9558362a5120eb7143810ab7f5a99881691849ea",
          "body": "Addresses Copilot review feedback on PR #52:\n\n* The transporterCache was a plain array property. Plain arrays are\n  value-typed in PHP, so `clone $this` gave each clone its own copy.\n  Chaining connect() on a clone (`$root->connect('a')->connect('b')`)\n  cached the second transporter only on the clo\n[…]\negression test: a chained connect() from a clone is observed on a\nlater root.connect(); make() is invoked exactly once per server.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(client): share transporter cache across clones via ArrayObject",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:53:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f89411b4145a97d1189abe68cd274b849fa3d4c",
          "body": "…ssing guards (P7)\n\nFixes the four interrelated MCPClient surface issues tracked in #48:\n\n* Bind MCPClient as a singleton (was bind()) so the facade and\n  constructor-injected callers resolve to the same instance.\n* Alias Contracts\\MCPClient to the concrete singleton — DI typing on\n  the interface n\n[…]\n\n$root->connect('x'); $root->tools();`) must now capture the clone:\n`$client = $root->connect('x'); $client->tools();` — or chain.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(client): singleton DI, contract alias, immutable connect, mi…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:36:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75557277734de094f08bad783ad0b3bacd6d9c96",
          "body": "fix(stdio): decouple request/process timeouts, inherit parent env (P8, fixes #47)",
          "is_bot": false,
          "headline": "Merge pull request #51 from RedberryProducts/fix/stdio-robustness",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:17:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b42d5ce52c26713f2e1487729de4e7acdb4ff320",
          "body": "Address Copilot review on PR #51.\n\n1. resolveEnv: getenv() with no args is documented to return false on\n   error (e.g. on platforms where retrieving the full env isn't\n   supported). array_merge(false, ...) would TypeError and crash the\n   process before it ever started. Coerce with `?: []`.\n\n2. re\n[…]\nimeout error\n   message uses %s so 1.0 still prints \"1\" but 1.5 prints \"1.5\".\n\nAdds two regression tests covering both behaviours.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(stdio): defensive getenv() and preserve float request_timeout",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:15:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bbc50342e9f29370af37b6a7361378862f3cc67",
          "body": "Windows env var names are case-insensitive: getenv() returns\nkeys like 'Path' while getenv('PATH') still resolves it,\nso the previous assertion `$env['PATH'] === getenv('PATH')`\nhit a null lookup on Windows even though the parent env was\ncorrectly inherited.\n\nSet our own parent env key with putenv() and assert that\nspecific key flows through, side-stepping system-key casing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(stdio): make resolveEnv merge test portable across Windows",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:08:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7ce6e277d39c04e9cb4a491d6c7e304457d036f0",
          "body": "`StdioTransporter` previously used a single 3-second `timeout` as both the\nper-call wait inside `waitForResponse()` and Symfony Process's 5th\nconstructor argument (the total-runtime kill timer). The first behaviour\nmade the README's own `npx -y @modelcontextprotocol/server-memory` example\nfail on co\n[…]\n now surface stderr, stdout, and the exit code\nin the message instead of routing them to `error_log()`.\n\nTracks GH issue #47 (P8).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(stdio): decouple request/process timeouts and inherit parent env",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T13:04:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3abe342aec8741de28d35212262d2cc76bede277",
          "body": "…-key\n\nfix(collection): match only/except on configurable key (P10)",
          "is_bot": false,
          "headline": "Merge pull request #50 from RedberryProducts/fix/p10-collection-match…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T12:53:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4977a99bbb726cf1927a3ce2a0d4940cd9a4b2e3",
          "body": "…tch-key\n\n# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into fix/p10-collection-ma…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T12:51:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b0bec02fb876da638251848e665bae436fbb6da",
          "body": "Collection::only() and except() previously hardcoded $item['name'] for\nmatching. MCP resources are keyed by uri, not name, so\n$client->resources()->only('file:///foo') silently returned an empty\ncollection — same Collection class behaving differently depending on\nwhich list it wrapped.\n\nThe construc\n[…]\nCPClient::resources() with 'uri'.\n\nDefault match key stays 'name', so existing tools-shaped call sites\nare unchanged.\n\nCloses #46.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Collection only/except match on configurable key (name vs uri)",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T12:46:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ae0ebf71d5eb17f287f6ba1435632ae8c8deccd",
          "body": "…e-defensive\n\nfix(http): defensive null-coalesce on JSON-RPC error.message (P9)",
          "is_bot": false,
          "headline": "Merge pull request #49 from RedberryProducts/fix/p9-http-error-messag…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T12:41:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3186f724105d7cb9b41a8e1ad85431629d07703b",
          "body": "…rter\n\nHttpTransporter::parseResponse() interpolated $data['error']['message']\nwithout a null-coalesce. Per JSON-RPC 2.0 the message field is SHOULD,\nnot MUST — spec-compliant servers may omit it, in which case PHP raised\na warning and the resulting TransporterRequestException carried an empty\nmessage.\n\nMirrors the pattern already applied in SseStreamParser (P1, #37). The\nJSON branch was missed in the same change.\n\nCloses #45.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: defensive null-coalesce on JSON-RPC error.message in HttpTranspo…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T12:40:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da2f6280207b30c0883d307f4852b34f91c6823c",
          "body": "docs: shrink ROADMAP.md now that P0–P6 have shipped",
          "is_bot": false,
          "headline": "Merge pull request #44 from RedberryProducts/docs/shrink-roadmap",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:50:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ee9db682242ced21249fbbf3ef65d052e5a2b13",
          "body": "All seven roadmap items have merged. Replaces the verbose Problem/Task/\nAcceptance bodies (which referenced file:line locations that have drifted\nor in some cases no longer exist after refactors) with a one-line\nCompleted entry per item linking to the merged PR. Original problem\nstatements remain ac\n[…]\nection anchors (#out-of-scope).\n- Removed CLAUDE.md's \"don't widen P0's changelog scope\" rule — P0\n  shipped, so the rule is dead.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: shrink ROADMAP.md to a completed list now that P0–P6 have shipped",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:49:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d903604d727250f6919c8bed544f1623c41b416d",
          "body": "…st-id-and-stdio-onevent-doc\n\nchore: incrementing HTTP request ids + document $onEvent on STDIO",
          "is_bot": false,
          "headline": "Merge pull request #43 from RedberryProducts/chore/incrementing-reque…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:43:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f60ac27f21192befc9af910a1f64e15ca576a8a",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:42:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "27c2ba98b3b735e41f4178b7075dc59c93fb093d",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:42:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1776c570774242fa0ca14e032da5d829422c2f8d",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:42:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "92b96cddefb1f18b21625a9511089d2b1dceceb5",
          "body": "The README's streaming-callback section previously only noted that the\ncallback fires zero times when the HTTP server returns a single JSON\nresponse. Streaming events are an HTTP-only concept (Streamable HTTP\ntext/event-stream); under STDIO the callback never fires at all today.\nMake that explicit so readers don't expect STDIO to surface progress\nevents.\n\nCloses ROADMAP P6.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: clarify \\$onEvent is a no-op under STDIO transport",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:32:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "37870b86f133fa7b9a95db1426a818b48dfc9a5f",
          "body": "Replaces random_int(1, 1_000_000) in HttpTransporter::generateId() with\n++$this->requestId, matching STDIO. Removes the ~1-in-1000 birthday-paradox\ncollision risk that the random source had over a long-lived session.\nThe id_type config (int vs string) still controls the output cast.\n\nThe initialize \n[…]\nslot of the user-request counter — user\nrequests on a fresh instance still produce ids 1, 2, 3, … as expected.\n\nCloses ROADMAP P5.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: switch HTTP request ids to a per-instance incrementing counter",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:31:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e41979ea5593839870446ad96532e7f5dade57eb",
          "body": "…r-test-no-reflection\n\ntest: migrate HttpTransporter tests off reflection-based state setup",
          "is_bot": false,
          "headline": "Merge pull request #42 from RedberryProducts/refactor/http-transporte…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:23:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0911e661d0f8397882c995e4615168c5fb31cd22",
          "body": "…roadmap item\n\nROADMAP P4's Problem/Task body still cites the (now-deleted)\ncreateTransporterWithMockedSession() helper at file:line locations\nthat no longer exist after this refactor. Add a Resolved-in pointer at\nthe top of the section so readers land on PR #42 and know the rest of\nthe body describes pre-refactor state.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: address Copilot review on P4 PR — flag stale refs in completed …",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:22:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4b59ba71eb51aacf509ea83c4612a0df14102a78",
          "body": "Replaces the createTransporterWithMockedSession() helper, which used\nReflectionClass to poke private $client / $sessionId / $initialized,\nwith setUpInitializedTransporter() — built on the existing constructor\ninjection seam plus method-specific Mockery expectations that prime the\ninitialize + notifications/initialized handshake.\n\nTests now exercise the real handshake path. No production code changes.\n\nCloses ROADMAP P4.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: migrate HttpTransporter tests off reflection-based state setup",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T11:17:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a77fbd40a87a375fd78e352bbe66641875a8219d",
          "body": "…ecovery\n\nfeat: HTTP transporter recovers from server-side session loss (P3)",
          "is_bot": false,
          "headline": "Merge pull request #41 from RedberryProducts/feat/http-session-loss-r…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T09:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "566098cdd53eba425015e5224f2bc0b977de29f0",
          "body": "…robust\n\nGuzzle defaults http_errors to true, but a caller can inject a client with\nit disabled (for custom logging/middleware). That client would return a\n404 as a normal ResponseInterface, slipping past the BadResponseException\ncatch and surfacing as a parse error in parseResponse() — bypassing th\n[…]\nirely.\n\nSetting http_errors=true in the per-request options makes the behavior\nindependent of the injected client's configuration.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: force http_errors=true per request so session-loss detection is …",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T09:50:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da6278f975d1c4e233bbeb61a4030e4eb00863c9",
          "body": "- request() docblock no longer claims @throws GuzzleException — both\n  BadResponseException and other GuzzleExceptions are now caught and\n  wrapped in TransporterRequestException, so neither escapes. Kept the\n  @throws JsonException line since the SSE parsing path can still raise\n  one (SseStreamPar\n[…]\nce — so the dereference is safe\n  by static type, not by accident. Documents the reasoning that PHPStan\n  already proves silently.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: address Copilot review on session-loss recovery PR",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T09:33:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e61ee6665d9d66c583fa72ae6281a9419569d568",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into feat/http-session-loss-recovery",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T09:30:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e67430354c02ba3efa41c65ef0824525186a78c",
          "body": "Per MCP 2025-03-26 Streamable HTTP, a server signals an expired or unknown\nsession by returning HTTP 404 to a request carrying `mcp-session-id`. The\ntransporter now detects this, clears the session, re-runs the initialize\nhandshake, and retries the original request once. Capped by a new\n`max_session\n[…]\nis\nHTTP-only — recorded in an inline doc comment so a future maintainer\ndoesn't invent a code-based heuristic.\n\nCloses ROADMAP P3.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HTTP transporter recovers from server-side session loss",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T09:13:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22014f843c7b1b9e7792d7aa0339bfb69bf45dac",
          "body": "…e-test-windows\n\ntest: fix stdio startup-failure test on Windows CI",
          "is_bot": false,
          "headline": "Merge pull request #40 from RedberryProducts/fix/stdio-startup-failur…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T08:42:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05fa988dcc029cb03b4c30c4f0ce0f4c6e9df9e9",
          "body": "…test\n\nWindows has no `false` binary, so the spawned process did not exit before\nthe 50 ms startup_delay and the test fell through to a timeout instead of\nthe asserted \"Process failed to start\" path. Use `cmd /c exit 1` on\nWindows so handleStartupFailure() is exercised on every platform.\n\nCloses #39\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: select OS-specific fail-fast command for stdio startup-failure …",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T08:39:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "99a65ff43ad13cf6f09ad4dab609762eb7ad5dee",
          "body": "feat: SSE inter-chunk read timeout protects against wedged streams",
          "is_bot": false,
          "headline": "Merge pull request #38 from RedberryProducts/feat/sse-read-timeout",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T06:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2124a9ad77644b444cdf3c3ee1b6d201d544b3c3",
          "body": "The parser already supports a null timeout for callers willing to wait\nindefinitely, but the HttpTransporter was unconditionally casting the\nconfig value to float — which both swallowed an explicit null (?? fell\nthrough to the default 60) and prevented any way to opt out.\n\nResolve via array_key_exis\n[…]\nault 60s\nwhile an explicit null is passed through to the parser. Adds a parser\ntest that asserts null disables timeout enforcement (stream ends with\nthe no-result error rather than the timeout error).",
          "is_bot": false,
          "headline": "fix: allow read_timeout=null in HttpTransporter config to disable",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T06:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3b469602e19cec12cecff9a3ffc2b0a7f34c341",
          "body": "Extract the timeout/backoff logic into awaitNextChunk() so the main\nloop reads top-to-bottom: read, if empty await, else record-time and\ndrain. Drops the 0.0 sentinel on $lastChunkAt and the per-iteration\nnull-check on $readTimeout in exchange for one unconditional\nmicrotime() per chunk.",
          "is_bot": false,
          "headline": "refactor: flatten SseStreamParser::parse() empty-read handling",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T06:40:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5705184c9ef8516b978eee0ae5d3deeca30ee9a6",
          "body": "- Replace WedgedStream fixture with a Mockery StreamInterface mock to\n  avoid an LSP signature mismatch under psr/http-message ^1.1, which the\n  package's prefer-lowest CI matrix exercises.\n- Add a 1ms backoff on empty reads when read_timeout is set so the parse\n  loop doesn't spin a CPU under non-blocking streams while waiting for\n  the timeout to elapse.\n- Add an HttpTransporter test that wires a wedged SSE response body and\n  asserts the configured read_timeout aborts the request end-to-end.",
          "is_bot": false,
          "headline": "fix: address Copilot review on SSE read-timeout PR",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-05T06:32:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "995c571fb8f0ccfc7043c24823799b3f6010fb33",
          "body": "Guzzle's timeout bounds connection setup, not body reads on a streamed\nresponse. A misbehaving server that holds the socket open without\nsending data would park a worker indefinitely on stream read.\n\nAdds an optional read_timeout config key on HttpTransporter (default\n60s), threaded through to SseSt\n[…]\nst received chunk and\nthrows TransporterRequestException once the gap exceeds the timeout.\nThe clock resets on every non-empty chunk, so long-running operations\nthat stream progress events stay alive.",
          "is_bot": false,
          "headline": "feat: SSE inter-chunk read timeout protects against wedged streams",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T14:33:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b21a5ea23ed848fa30d3738eb2b598a765b38e7f",
          "body": "…-error-message\n\nfix: defensive error-message handling in SseStreamParser",
          "is_bot": false,
          "headline": "Merge pull request #37 from RedberryProducts/fix/sse-parser-defensive…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T14:27:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c99798d5c610b5fe671cda2c54f9a425fdab7929",
          "body": "Mirror the StdioTransporter fallback so a JSON-RPC error event without a\nmessage field no longer raises a PHP warning. The error code is still\npreserved on the thrown TransporterRequestException.",
          "is_bot": false,
          "headline": "fix: defensive error-message handling in SseStreamParser",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T14:23:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b161cfe82156e1d30ab2beece4b86325dffbef7a",
          "body": "…ize-handshake\n\nfix: spec-correct initialize handshake on Streamable HTTP transport",
          "is_bot": false,
          "headline": "Merge pull request #35 from RedberryProducts/fix/spec-correct-initial…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T14:04:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b775ab28b04a4c371731a42b9a958c2f2e55f7f",
          "body": "The previous assertion would have failed if the package ever shipped a\nreal 0.1.0 release. The meaningful check — that the version was\nresolved to something — is already covered by `toBeString()`; the\nnon-empty assertion just makes that bound explicit.\n\nAddresses Copilot review feedback on PR #35.",
          "is_bot": false,
          "headline": "test: assert clientInfo.version is non-empty rather than not '0.1.0'",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bb819fa0b81c71f1d8e6d26b88987782fbd6fc2",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into fix/spec-correct-initialize-handshake",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69c4d6db74a4da5bf9ab1c81f2c51c097e0d9d67",
          "body": "chore: pin Pint config and align lint CI to PHP 8.4",
          "is_bot": false,
          "headline": "Merge pull request #36 from RedberryProducts/chore/pin-pint-config",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:47:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ef5f2ca666c1749462695800806a39125480484",
          "body": "The package had no `pint.json`, which meant Pint's `laravel` preset\nwas used with whatever implicit defaults the installed Pint version\nshipped with — so rules that vary by Pint patch version (and by PHP\nversion) drifted between local runs and CI. The P0 PR tripped on\nthis when CI rejected an inline\n[…]\n is still covered by\n  the test matrix in `run-tests.yml`.\n- Remove the now-resolved Pint drift entry from ROADMAP \"Out of scope\".\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: pin Pint config and align lint CI to PHP 8.4",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:46:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43e13b6067ae180eae4c8d9e0a1f6e62b441942c",
          "body": "CI's Pint runs `fully_qualified_strict_types` and rejects inline\n`\\Redberry\\MCPClient\\Core\\Mcp::PROTOCOL_VERSION` references in the\nnew tests. Local Pint didn't flag these (the rule drift is a known\nissue per ROADMAP \"out of scope\"). Switch to a regular `use` import.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: import Mcp class in tests instead of inline FQN",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:41:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "62bc92aaee18d67163c716940b3a4c09a6c93744",
          "body": "The HTTP transporter's `initialize` payload was missing `protocolVersion`,\n`capabilities`, and `clientInfo`, and we never sent the follow-up\n`notifications/initialized` message. Strict-spec MCP servers (the official\nTS reference, Anthropic's reference servers) reject this and refuse to\nserve `tools/\n[…]\nersion` comes from the installed composer package version\ninstead of the hardcoded `0.1.0` STDIO used to send.\n\nCloses ROADMAP P0.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: spec-correct initialize handshake on Streamable HTTP transport",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:36:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "913763e1d9dfc2a7f053c43cdb2d3335f9bca662",
          "body": "docs: add AI/contributor context (CLAUDE.md, ARCHITECTURE.md, etc.)",
          "is_bot": false,
          "headline": "Merge pull request #34 from RedberryProducts/fix/ai-development",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:10:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d1f9c58123e0d23d788003bb2479b81bd735de5",
          "body": "ARCHITECTURE goes deep on the layers, request flow, and lifecycles for\nboth transports — the bits that aren't obvious from reading the source.\nCONTRIBUTING covers local setup, the bin/check gate, ROADMAP-per-PR\nscoping, and the Conventional Commits style we already use.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add ARCHITECTURE.md and CONTRIBUTING.md",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T13:08:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96ecbe15c2e2b4e7aa7d1ef3599e82b3d63e2e61",
          "body": null,
          "is_bot": false,
          "headline": "feat: add files to enhance AI development capabilities",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T12:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aeccbd1d436c5989dd5aa157235e1e7c4c7a99b",
          "body": "Add MCP Streamable HTTP transport support",
          "is_bot": false,
          "headline": "Merge pull request #33 from RedberryProducts/feat/add-streamable-http",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T12:39:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae411279d9d2d2be1e94cd09722269e0fb2ed7b6",
          "body": "- `parseResponse()` now returns the full JSON envelope when `result` is\n  scalar/null, mirroring the SSE parser. Keeps the typed `: array`\n  return contract intact for any JSON-RPC payload.\n- `initializeSession()` wraps Guzzle exceptions as\n  `TransporterRequestException` so handshake failures surfa\n[…]\n\n  message — including the final result-bearing one — rather than only\n  intermediate ones.\n- Added tests covering the new initialize-failure wrapping and a JSON\n  response whose `result` is a scalar.",
          "is_bot": false,
          "headline": "Address second round of Copilot review feedback",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T12:25:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4aa7d7e529e34c4040c490db022aa51fd677ef8",
          "body": "Address Copilot review feedback:\n\n- `HttpTransporter::request()` and `preparePayload()` now take\n  `array $params = []` instead of `?array $params = null`, matching the\n  `Transporter` contract and removing a contravariant divergence that\n  StdioTransporter doesn't share.\n- `preparePayload()` casts \n[…]\n params encode as `{}` (what spec-strict servers expect),\n  consistent with `StdioTransporter`.\n- Updated the SSE callback test to pass `[]` instead of `null` for\n  params, in line with the interface.",
          "is_bot": false,
          "headline": "Align HttpTransporter::request signature with Transporter interface",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T12:15:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7a0ce5bfed27b46d2809d326acf4ffad3147321",
          "body": "CI's `pint --test` flags `fully_qualified_strict_types` violations in\nthree files unrelated to the streamable HTTP work, blocking the PR.\nApply the rule (use imported short names instead of inline FQCNs).\n\nNo behavior change.",
          "is_bot": false,
          "headline": "chore: fix pre-existing Pint style issues",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T12:06:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39efb88ea35710d07d5f71503e8e117c918759c5",
          "body": "The HTTP transporter now implements the 2025-03-26 MCP Streamable HTTP\nspec: every request advertises `Accept: application/json, text/event-stream`\nand the server picks — per call — between a single JSON response and an\nSSE stream of JSON-RPC messages. The client handles both transparently.\n\n- New `\n[…]\nCHANGELOG updated; new tests cover the SSE parser\n  (events, comments, multi-line data, [DONE], errors, trailing line)\n  and the transporter's content-negotiation, callback forwarding, and\n  DI paths.",
          "is_bot": false,
          "headline": "Add MCP Streamable HTTP transport support",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T11:41:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "003495ffe1e1c6f5379cac55d124962334d54f06",
          "body": "…s/dependabot/fetch-metadata-3.1.0\n\nBuild(deps): Bump dependabot/fetch-metadata from 2.4.0 to 3.1.0",
          "is_bot": false,
          "headline": "Merge pull request #32 from RedberryProducts/dependabot/github_action…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T10:36:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf50d0f9a541380cfc150166eb559de4f2ee8f7c",
          "body": "…etadata-3.1.0",
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/dependabot/fetch-m…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T10:36:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d3fa09af10f939b7576979f433788b7d0be0669",
          "body": "…s/ramsey/composer-install-4\n\nBuild(deps): Bump ramsey/composer-install from 3 to 4",
          "is_bot": false,
          "headline": "Merge pull request #31 from RedberryProducts/dependabot/github_action…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T10:36:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51d895a56ef3f859d2a52213f4529c4a9fc3d705",
          "body": "Bumps [ramsey/composer-install](https://github.com/ramsey/composer-install) from 3 to 4.\n- [Release notes](https://github.com/ramsey/composer-install/releases)\n- [Commits](https://github.com/ramsey/composer-install/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: ramsey/composer-install\n  dependency-version: '4'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Build(deps): Bump ramsey/composer-install from 3 to 4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-04T10:11:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bb72d9f416eddbd4834928034bcbb828eaf9e9c",
          "body": "Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.4.0 to 3.1.0.\n- [Release notes](https://github.com/dependabot/fetch-metadata/releases)\n- [Commits](https://github.com/dependabot/fetch-metadata/compare/v2.4.0...v3.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: dependabot/fetch-metadata\n  dependency-version: 3.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Build(deps): Bump dependabot/fetch-metadata from 2.4.0 to 3.1.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-04T10:11:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c498a6ac6629b5b3c374f095a855fc7c31c5bcd",
          "body": "…s/actions/checkout-6\n\nBuild(deps): Bump actions/checkout from 5 to 6",
          "is_bot": false,
          "headline": "Merge pull request #28 from RedberryProducts/dependabot/github_action…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2026-05-04T10:10:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e30db9450cb74d9631537634f8d4bc449073e95",
          "body": null,
          "is_bot": false,
          "headline": "Update links in README for tracking parameters",
          "author_name": "Revaz Gh.",
          "author_login": "MaestroError",
          "committed_at": "2025-12-19T10:51:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed391b69ec1be6ebdfcce73076311ab06d932abf",
          "body": "Updated README to enhance clarity and provide additional details about the MCP Client for Laravel.",
          "is_bot": false,
          "headline": "Revise README for MCP Client clarity and details",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-12-02T12:13:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e14a700cc1a2f793417bfa711ca6cc169944b4a4",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v5...v6)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '6'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Build(deps): Bump actions/checkout from 5 to 6",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-11-24T03:37:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a582f02194d80626fcb2ed7264b5095d110a488b",
          "body": "…s/stefanzweifel/git-auto-commit-action-7\n\nBuild(deps): Bump stefanzweifel/git-auto-commit-action from 6 to 7",
          "is_bot": false,
          "headline": "Merge pull request #21 from RedberryProducts/dependabot/github_action…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-07T07:29:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a65d1c295ae25a899bdb4a11e01a2729324b1b65",
          "body": "…auto-commit-action-7",
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/stefanzweifel/git-…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-07T07:09:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "859f4d7a9c689ed832c08698f7b9c0d2bdb4277c",
          "body": "…s/actions/checkout-5",
          "is_bot": false,
          "headline": "Merge pull request #17 from RedberryProducts/dependabot/github_action…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-06T17:48:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df1d4ddd241fe814f9102151e05b7fdecb65b7d",
          "body": "…auto-commit-action-7",
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/stefanzweifel/git-…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-06T16:06:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a255b072f22a732ae8e65f047d26502c259f047d",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/actions/checkout-5",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-06T16:05:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84366e1cb83113b0d702b6ac2d30e7a7501567f1",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #26 from RedberryProducts/headers-url-and-fixes",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-11-06T16:04:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "967c594c5b75db4bdd4ba96656dc49c47ef09ca2",
          "body": null,
          "is_bot": false,
          "headline": "Fixed test for trailing slash",
          "author_name": "maestroerror",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T15:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e8579e0ee81e47279f84d218c7dbc2e28457094",
          "body": null,
          "is_bot": false,
          "headline": "Using base_uri as is",
          "author_name": "maestroerror",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T15:04:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d84f33cde1c74ed28339815954212f1426b7b171",
          "body": "Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Apply suggestions from code review",
          "author_name": "Revaz Gh.",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T14:51:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01f1003e8b0ae4e6aed8dd1af30133f183034ff1",
          "body": null,
          "is_bot": false,
          "headline": "Pint & interval defaults updated",
          "author_name": "maestroerror",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T14:48:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f2f88f8c6f89012a865260dd00127ffc5a4c6f5",
          "body": null,
          "is_bot": false,
          "headline": "intervals configuration",
          "author_name": "maestroerror",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T14:42:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8b4eee38635d97ce9a28a7faaf02ac044800eb7",
          "body": null,
          "is_bot": false,
          "headline": "Fixes & Arbitrary headers",
          "author_name": "maestroerror",
          "author_login": "MaestroError",
          "committed_at": "2025-11-06T14:06:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "091f3413aa026cbdcf6d698100892f309ea4f9b7",
          "body": "Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 6 to 7.\n- [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases)\n- [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md)\n- [Co\n[…]\n stefanzweifel/git-auto-commit-action\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Build(deps): Bump stefanzweifel/git-auto-commit-action from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-10-13T03:32:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a702ca52d59488d9e51eed705af01be0c818e05",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into dependabot/github_actions/actions/checkout-5",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T13:36:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af6db8f7e4ecb5af06df9ffb9505709b4e8fe1e9",
          "body": null,
          "is_bot": false,
          "headline": "Update Packagist links in README.md",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T13:34:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1fd4ed393a1220742ed1b571a9a738aa9c2fa60",
          "body": "Chore: Change package name to follow new convention",
          "is_bot": false,
          "headline": "Merge pull request #20 from RedberryProducts/chore/rename-package",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T13:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5473ef7531d14e7372b4dce3009db4bff3d3a7a4",
          "body": null,
          "is_bot": false,
          "headline": "Feat: Add executable check file that will run linters and tests",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T13:09:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "263eccd53ebd65e45a9c64d55499580095e6e74f",
          "body": null,
          "is_bot": false,
          "headline": "Refactor: Remove extra database path from phpstan config file",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T13:00:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77ca33846e40d91f0ca4df01b3a4d44bc4b460a1",
          "body": null,
          "is_bot": false,
          "headline": "Refactor: Remove unused folders and add custom name for config file",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:59:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c6b13c9bccae21ba04eb1ffa35a9bd7942566f6",
          "body": null,
          "is_bot": false,
          "headline": "Chore: Change package name to follow new convention",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b19c41ea04f936b5c7b998d6710caec14c988df4",
          "body": "…docs\n\nAdded ReadResource action and action methods in usage docs",
          "is_bot": false,
          "headline": "Merge pull request #19 from RedberryProducts/resources-execution-and-…",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:52:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e8ba99fe531331cf5279b8fd0baa2bfec5ce655",
          "body": null,
          "is_bot": false,
          "headline": "Fix: styling issue",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:49:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fdf8dec4c040c246c3ae4f483d318b0984ca571",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into resources-execution-and-docs",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:47:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362edb765d91cfd8d3da64dc6148bd4e0c2bddd7",
          "body": "Fixed timeout config and added note in docs",
          "is_bot": false,
          "headline": "Merge pull request #18 from RedberryProducts/fix/get-timeout-from-config",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:46:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c48ab253eca82a11f5b3fd0f8132bcbc8463707",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Styling issues",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:43:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb239f99a0c646eae84aad5f6cde0898cc1d3e6c",
          "body": null,
          "is_bot": false,
          "headline": "Fix: tests failing due to timeout being passed as env property",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:42:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12b97783a15a9e51646d6b0683d82be45dd8e102",
          "body": "This reverts commit 06fc7891b4784198b76da8f8fe123ad572518326.",
          "is_bot": false,
          "headline": "Revert \"Fix: Test and renamed package following new naming convention\"",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:40:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06fc7891b4784198b76da8f8fe123ad572518326",
          "body": null,
          "is_bot": false,
          "headline": "Fix: Test and renamed package following new naming convention",
          "author_name": "Nika Jorjoliani",
          "author_login": "nikajorjika",
          "committed_at": "2025-09-29T12:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c2510515aa05df67ef011629d2e48420b78f3c3",
          "body": "Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Revaz Gh.",
          "author_login": "MaestroError",
          "committed_at": "2025-09-25T14:17:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 3,
      "commits_last_year": 131,
      "latest_release_at": "2026-05-08T10:57:33Z",
      "latest_release_tag": "v1.1.1",
      "releases_from_tags": false,
      "days_since_last_push": 30,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 74,
      "mean_days_between_releases": 110.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "redberry/mcp-client-laravel",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "laravel",
            "redberry",
            "mcp-client-laravel"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/redberry/mcp-client-laravel",
          "is_deprecated": false,
          "latest_version": "v2.0.0-rc.1",
          "repository_url": "https://github.com/RedberryProducts/mcp-client-laravel",
          "versions_count": 4,
          "total_downloads": 99674,
          "dependents_count": 1,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 16084,
          "first_published_at": null,
          "latest_published_at": "2026-05-05T17:26:01Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 77
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 13,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2025-12-02",
            "count": 1
          },
          {
            "date": "2026-02-07",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": {
        "days": [
          {
            "date": "2025-07-16",
            "count": 1
          },
          {
            "date": "2025-09-29",
            "count": 10
          },
          {
            "date": "2025-10-03",
            "count": 1
          },
          {
            "date": "2025-10-17",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 13,
        "total_stars": 13
      },
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 39957,
      "source_files_sampled": 27,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 8601
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 15,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "guzzlehttp/guzzle",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^7.5"
        },
        {
          "name": "illuminate/contracts",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^10.0||^11.0||^12.0||^13.0"
        },
        {
          "name": "psr/http-message",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^1.1||^2.0"
        },
        {
          "name": "spatie/laravel-package-tools",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^1.16"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "guzzlehttp/guzzle",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "illuminate/contracts",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "psr/http-message",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "spatie/laravel-package-tools",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "larastan/larastan",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "laravel/pint",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "nunomaduro/collision",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "orchestra/testbench",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "pestphp/pest",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "pestphp/pest-plugin-arch",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "pestphp/pest-plugin-laravel",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "php",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/extension-installer",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/phpstan-deprecation-rules",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/phpstan-phpunit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 15,
        "direct_count": 4,
        "indirect_count": 11
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 38,
        "open_issues": 2,
        "closed_ratio": 0.818,
        "closed_issues": 9,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "nikajorjika",
          "commits": 156,
          "avatar_url": "https://avatars.githubusercontent.com/u/4212052?v=4"
        },
        {
          "type": "User",
          "login": "MaestroError",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/46760939?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.918
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "dependabot-auto-merge.yml",
        "fix-php-code-style-issues.yml",
        "phpstan.yml",
        "run-tests.yml",
        "update-changelog.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 1,
            "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": 8,
            "reason": "7 out of 8 merged PRs checked by a CI test -- score normalized to 8",
            "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": 0,
            "reason": "Found 0/8 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": "30 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": null,
            "reason": "no dependencies found",
            "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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b0db4abafa26c1a16d515e397fbb9b6075fdfca5",
        "ran_at": "2026-07-22T03:41:39Z",
        "aggregate_score": 5.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T03:54:23Z",
      "oldest_open_prs": [
        {
          "number": 56,
          "created_at": "2026-06-22T03:33:25Z",
          "last_comment_at": "2026-06-22T03:33:26Z",
          "last_comment_author": "dependabot"
        }
      ],
      "last_merged_pr_at": "2026-05-08T10:56:05Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 23,
          "created_at": "2025-11-06T14:34:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 25,
          "created_at": "2025-11-06T14:41:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/RedberryProducts/mcp-client-laravel",
    "host": "github.com",
    "name": "mcp-client-laravel",
    "owner": "RedberryProducts"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 60,
      "inputs": {
        "security": 52,
        "vitality": 75,
        "community": 47,
        "governance": 57,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "commits_last_year": 131,
              "human_commit_share": 0.96,
              "days_since_last_push": 30,
              "active_weeks_last_year": 11
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 30 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "131 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 131
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 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": 92,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v1.1.1",
              "releases_from_tags": false,
              "days_since_latest_release": 74,
              "mean_days_between_releases": 110.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 74 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 74
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~110.4 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 110.4
                    }
                  }
                ],
                "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": 77,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 77 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 77
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "forks": 3,
              "stars": 13,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "13 stars",
                "points": 17.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "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": 18,
                "status": "met",
                "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": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "packages": [
                "redberry/mcp-client-laravel"
              ],
              "dependents": 1,
              "ecosystems": "packagist",
              "total_downloads": 99674,
              "monthly_downloads": 16084
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "16,084 downloads/month across packagist",
                "points": 56.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 16084,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "1 packages depend on it",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.918
            },
            "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 92% of commits",
                "points": 1.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "merged_prs": 38,
              "open_issues": 2,
              "closed_issues": 9,
              "issue_closed_ratio": 0.818,
              "closed_unmerged_prs": 6
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "82% of issues closed",
                "points": 38.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "38/44 decided PRs merged",
                "points": 33,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 38,
                      "decided": 44
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/8 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "followers": 38,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "RedberryProducts",
              "public_repos": 37,
              "account_age_days": 2316
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "38 followers of RedberryProducts",
                "points": 11.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 38,
                      "login": "RedberryProducts"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "37 public repos, account ~6 yr old",
                "points": 23.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 37
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "redberry/mcp-client-laravel"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 77
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on packagist",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 77 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 77
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "4 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 66,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "7 out of 8 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "agent-integration",
                "ai-agents",
                "ai-framework",
                "chatbot",
                "context",
                "laravel",
                "laravel-ai",
                "laravel-package",
                "llm",
                "mcp",
                "mcp-client",
                "memory",
                "openai",
                "php",
                "prompt-engineering",
                "redberry",
                "tools"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "17 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 52,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 5.1
            },
            "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": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "7 out of 8 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "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 0/8 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "30 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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": 2
            },
            "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": 59,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.698,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 8601
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "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": "67 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 37.2,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.31,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.04
            },
            "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "31 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 31,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "4 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 4,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 39957,
              "source_files_sampled": 27,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/27 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 27,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T03:41:54.601478Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/RedberryProducts/mcp-client-laravel.svg",
  "full_name": "RedberryProducts/mcp-client-laravel",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPackagist.