Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 21586,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 469955,
"Shell": 3329,
"Makefile": 3096,
"Dockerfile": 874,
"JavaScript": 1614
},
"pushed_at": "2026-07-17T18:28:14Z",
"created_at": "2026-07-17T17:22:06Z",
"owner_type": "Organization",
"updated_at": "2026-07-17T17:47:38Z",
"description": "hard-fork of korotovsky/slack-mcp-server + a few improvements",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://c3.do/oss",
"name": "C3 OSS",
"type": "Organization",
"login": "c3-oss",
"company": null,
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/205566491?v=4",
"created_at": "2025-03-31T01:08:33Z",
"is_verified": null,
"public_repos": 13,
"account_age_days": 478
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-07-17T17:25:54Z"
}
],
"recent_commits": [
{
"oid": "b91891f7b396db29522763608f02155f8381b75f",
"body": "Remove the upstream Trust Score badge and the security policy pointing at\nthe original maintainer; ownership credit remains in LICENSE.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: drop old-owner references and SECURITY.md",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:47:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "68ed6573158f050b8aaa31cb112171366d53abff",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: remove integration tests workflow",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:47:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "12ad14953a51bcc6c7405831dfce59e02714bb96",
"body": "GoReleaser publishes the .env.dist extra file as default.env.dist, so the\ndocker-compose download instructions must reference that name.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: use the actual default.env.dist release asset name",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:34:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "931d814e740977cfb2ff08943e8865aa14261832",
"body": "Point npx usage at @c3-oss/slack-mcp-server, the container image at\nghcr.io/c3-oss/slack-mcp-server, and repository links at c3-oss. Remove\nthe DXT installation method.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: retarget installation to @c3-oss packages and image",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:21:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5bdf516fd74120abf50771f39b823ac2d5435566",
"body": "Remove the Anthropic DXT desktop-extension packaging and prune the\nMakefile to linux/darwin builds, dropping the Windows and hand-rolled\nnpm-publish targets now handled by GoReleaser and publish-npm.sh.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: drop DXT extension build and simplify Makefile",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:21:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9de95d1e64df959f7abf75b214b7398c534d75f4",
"body": "Rework the npm distribution into the scoped @c3-oss/slack-mcp-server\npackage plus four linux/darwin platform sub-packages, driven by\nscripts/publish-npm.sh consuming the GoReleaser dist output. Replace the\nlauncher with a signal-forwarding spawn shim. Drop the Windows packages.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "build(npm): publish scoped @c3-oss packages from GoReleaser artifacts",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:21:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "41a965341da7e9861aeca3c11e0bf5ec8842ccec",
"body": "Add a GoReleaser config and a single tag-driven Release workflow that\nbuilds cross-platform binaries, archives, checksums and SBOMs, publishes\na GitHub Release, then publishes npm packages and a multi-arch image to\nGHCR. Remove the legacy Makefile/macOS NPM release and the separate image\nworkflow.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci(release): migrate release pipeline to GoReleaser",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:21:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "05317d2a08410ebd1b37f5c193cbd53ca89e351a",
"body": "Repoint the module from github.com/korotovsky/slack-mcp-server to\ngithub.com/c3-oss/slack-mcp-server and update all internal imports.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: rename Go module path to c3-oss",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T17:21:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bb05c671fe4a763c98ba6de0004eb78892956ea3",
"body": "- Add `file_paths` support for message posting with environment-gated validation via `SLACK_MCP_FILES_UPLOAD_TOOL` and `SLACK_MCP_FILES_UPLOAD_PATHS`.\n- Refactor message handling to support file-only posts and shared rendering through `renderMessage`, plus path security checks and per-root directory\n[…]\ndjust docs/env docs for `text`/`blocks` fallback and new upload configuration.\n- Extend unit tests for upload path validation, upload flow behavior, failure handling, and schema registration behavior.",
"is_bot": false,
"headline": "feat(handler): add file uploads to conversations_add_message",
"author_name": "Caian Ertl",
"author_login": "upsetbit",
"committed_at": "2026-07-17T16:28:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b88c0de3f706f4f07337c9eda7133c736d1c9524",
"body": null,
"is_bot": false,
"headline": "Remove maintainer note from configuration documentation",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:51:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31f3f69e6208cc207ce4734fa526f01949627c96",
"body": null,
"is_bot": false,
"headline": "Update 02-installation.md",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:51:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2aedf06896bbb95e56792afe882fb5c18439667d",
"body": null,
"is_bot": false,
"headline": "Remove maintainer note from authentication setup",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:50:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a079b3cd4d5836d791c942a9fc107987e7865b37",
"body": null,
"is_bot": false,
"headline": "Golang version bump to 1.25",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:46:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf0ce0d8f56cfeb8217b047685a90632b0a09d18",
"body": null,
"is_bot": false,
"headline": "Integration tests fix",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:42:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b58192cd5e343a05b65ee23a07281a5528e36fae",
"body": null,
"is_bot": false,
"headline": "Update go in Dockerfile",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T22:26:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c88ed62a61b62371d7ffb63f502134f8271db4f1",
"body": "PR #269 added a leading ctx parameter to convertMessagesFromHistory\nbut missed the three call sites in saved.go, breaking the build.",
"is_bot": false,
"headline": "fix: pass ctx to convertMessagesFromHistory calls in saved.go",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T21:09:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "01f0ad4525a7fce52d53ff639ce25127953ca188",
"body": "…/go-dependencies-f46f41233a\"\n\nThis reverts commit 400c900774bff81946ae0aa466e0ba661163ee66, reversing\nchanges made to 19e8a0c7b13762e71c41b2e44d840601e05600db.",
"is_bot": false,
"headline": "Revert \"Merge pull request #292 from korotovsky/dependabot/go_modules…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T21:07:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "342e3e3cd2bd218e733d902af996c83f90fe7a0a",
"body": "Add targeted user cache patch on miss",
"is_bot": false,
"headline": "Merge pull request #269 from gkatz2/feature/targeted-user-cache-patch",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T21:01:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "400c900774bff81946ae0aa466e0ba661163ee66",
"body": "…ndencies-f46f41233a\n\ndeps(go): bump the go-dependencies group across 1 directory with 9 updates",
"is_bot": false,
"headline": "Merge pull request #292 from korotovsky/dependabot/go_modules/go-depe…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T21:01:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19e8a0c7b13762e71c41b2e44d840601e05600db",
"body": "…lumn\n\nThe integration test added in #252 was reading row[0], which is the channel\nID column in channels_list CSV output, not the channel name. The CI for\n#252 never ran (status checks were empty at merge time), so this slipped\nthrough. Now resolves to the Name column by header lookup, matching the\nconvention used elsewhere in this file.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: fix TestIntegrationChannelsListQueryFilter to assert on Name co…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:32:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2e2c4b5e92e8dbefbc87378f50e7cad27d5f525e",
"body": "feat: extract email metadata from file-type messages",
"is_bot": false,
"headline": "Merge pull request #192 from derodero24/feat/extract-email-file-text",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:28:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c298e5cf9cc650457f66baa5326fd3d7049d6a25",
"body": "When emails are forwarded to Slack channels, message content is stored in\nfiles[] with filetype \"email\" rather than in text or blocks. This adds\nFilesToText() to extract From, CC, and Subject metadata as a fallback\nwhen msg.Text is empty, so these messages no longer appear as blank rows\nin conversations_history output.\n\nCloses #191",
"is_bot": false,
"headline": "feat: extract email metadata from file-type messages",
"author_name": "derodero24",
"author_login": "derodero24",
"committed_at": "2026-05-14T20:27:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "781cc51f20bf34166a9c19a2d66bc40124e25dd5",
"body": "…dates\n\nBumps the go-dependencies group with 8 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/mark3labs/mcp-go](https://github.com/mark3labs/mcp-go) | `0.44.0` | `0.54.0` |\n| [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) | `0.0.20` | `0.0.22\n[…]\n dependency-version: 0.15.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n dependency-group: go-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(go): bump the go-dependencies group across 1 directory with 9 up…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-14T20:25:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bee5d7388396d22b42b7821ca645f3d80abfe366",
"body": "Resolves the two HIGH-severity findings from the Trivy filesystem scan:\n- CVE-2026-32285 (github.com/buger/jsonparser, fixed in v1.1.2)\n- CVE-2026-34986 (github.com/go-jose/go-jose/v3, fixed in v3.0.5)\n\nBoth are indirect deps, bumped via `go get` + `go mod tidy`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "deps: bump jsonparser v1.1.1→v1.1.2 and go-jose/v3 v3.0.4→v3.0.5",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:23:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bfc6fb7e7364eae002d427e395820a8f7366bfb9",
"body": "feat: add channels_me tool",
"is_bot": false,
"headline": "Merge pull request #220 from georgebashi/feat/channels-me",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:21:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae3c7b4f134a31b63457a811f7f9b0fa2a2cee32",
"body": "The sort=popularity option forced fetching every channel the user belongs\nto before sorting client-side — hundreds of API calls on large workspaces.\nThe Slack API doesn't support server-side sorting, so this was inherently\nexpensive. Remove it and always stop fetching once we have enough results,\nusing the Slack API's native cursor for pagination.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf: remove sort param from channels_me, always use fast path",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-05-14T20:20:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6f0114928a625ecb77d6a5c66c5ec70c3ead9a09",
"body": "When sort is not \"popularity\", stop paginating the Slack API as soon as\nwe have enough results for the requested limit, and pass through the\nAPI's native cursor. On large workspaces this avoids hundreds of API\ncalls when only a small number of channels are requested.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf: stop fetching all API pages in channels_me when not needed",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-05-14T20:20:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "55842fe2c835f535b53829aaef7d291e3629ece5",
"body": "Add a new MCP tool to list channels the calling user is a member of,\nusing the users.conversations API. Follows the same pattern as\nusergroups_me vs usergroups_list.\n\nUnlike channels_list which returns all workspace channels, channels_me\nreturns only channels the user has joined — useful on large workspaces\nwhere channels_list returns thousands of results.\n\nSupports channel_types, sort (by popularity), limit, and cursor\nparameters.",
"is_bot": false,
"headline": "feat: add channels_me tool",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-05-14T20:20:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b32ab23eb96df11045d317e6d5c5d5bee24bbb27",
"body": "…emoval\n\nThe test was added by #272 (d3f7ca3) when AttachmentToText still applied\n`(` → `[` and `)` → `]` substitutions, which produced `[text][url]` output.\n#281 (5c095ac) removed those substitutions, so AttachmentToText now emits\nproper markdown `[text](url)`. The test wasn't updated in #281's merge.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: update title_with_link expectation after bracket-substitution r…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:19:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c095ac93504080c1f09b9172374cf034c1329bd",
"body": "fix(text): stop deleting punctuation, emoji, and quotes from messages",
"is_bot": false,
"headline": "Merge pull request #281 from byrmsh/fix/preserve-message-content",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:12:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c65342951714c314116bd03f5f5f8cc5846a3f07",
"body": "fix: bot and integration messages silently lose structured content",
"is_bot": false,
"headline": "Merge pull request #272 from tim-watcha/feat/attachment-fields",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:11:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e49db6aa249c606788badbf49de71b8f207f1045",
"body": "feat: add query and query_targets parameters to channels_list tool",
"is_bot": false,
"headline": "Merge pull request #252 from unsafe9/feature/channels-list-query-filter",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:11:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69cd994d9d0641c28414e5d33eac17ba1c102c2d",
"body": "feat: add saved_list, saved_update, and saved_clear_completed tools",
"is_bot": false,
"headline": "Merge pull request #240 from jonzarecki/feat/saved-items",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:11:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60566a196f7d12f93890e0354cb1396c090e509b",
"body": "feat: stale-while-revalidate cache for large Slack workspaces",
"is_bot": false,
"headline": "Merge pull request #225 from flacoste/feat/stale-while-revalidate-cache",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:10:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21775f640d9a34e3c794664720181124492763f0",
"body": "feat: return image attachments as native MCP image content",
"is_bot": false,
"headline": "Merge pull request #237 from vbichkovsky/feat/native-image-content",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:10:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a93cb3ea2407a497d2c3d6f47e3c9bc9cf4cc616",
"body": "…hub-actions-0edc9ef621\n\ndeps(gha): bump the github-actions group across 1 directory with 5 updates",
"is_bot": false,
"headline": "Merge pull request #280 from korotovsky/dependabot/github_actions/git…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T20:10:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df22121447b6d6f64d4e80f030a059af489c8822",
"body": "- Fix infinite loop on cold start when API returns zero results: return\n error instead of nil when no existing cache is available, so the\n watcher calls Fatal rather than spinning IsReady() forever\n- Secure temp file handling: use os.CreateTemp for unpredictable names\n (prevents symlink attacks) \n[…]\n PII)\n- Extract atomicWriteFile helper to deduplicate temp+rename pattern\n- Fix stale docstring: getCacheTTL default is 24h not 1h\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: address code review findings from multi-agent analysis",
"author_name": "Francis J. Lacoste",
"author_login": "flacoste",
"committed_at": "2026-05-14T19:44:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6e93a4017481ba1613439383f3cb2e45d3708d28",
"body": "- Restore IsReady() polling loop before ServeStdio() to fix cold-start\n regression where tool calls fail for 60-90s on first run (no cache)\n- Add fetchUsersMu/fetchChannelsMu mutexes to serialize fetchAndStore*\n calls, preventing race between ForceRefresh and background refresh\n- Use atomic file w\n[…]\nGuard against empty cache files being treated as valid data\n- Fix typo: TestRefreshingFlagPreventsConucrrentRefreshes → Concurrent\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: address PR #225 review feedback for SWR cache",
"author_name": "Francis J. Lacoste",
"author_login": "flacoste",
"committed_at": "2026-05-14T19:44:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f16fb0fe2b307581aea915473ca8192cf480e97d",
"body": "On large workspaces (41K+ users), the server blocks for ~90 seconds\nduring startup while fetching all users/channels from the Slack API,\nexceeding MCP client connection timeouts.\n\nChanges:\n- Load expired cache files immediately, mark server ready, then refresh\n in background via goroutine (stale-wh\n[…]\nusage.md\n\nFixes startup timeout on large workspaces. Server now starts in under\n1 second regardless of workspace size when a cache file exists.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: stale-while-revalidate cache for large Slack workspaces",
"author_name": "Francis J. Lacoste",
"author_login": "flacoste",
"committed_at": "2026-05-14T19:44:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d3f7ca3a4a0498ee65f3795ba53de6d8935b34b6",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: include attachment TitleLink in message text output",
"author_name": "tim-watcha",
"author_login": "tim-watcha",
"committed_at": "2026-05-14T19:34:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d9213df8f97b529b3c8a436ae92844fffa722f8b",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: include attachment Fields in message text output",
"author_name": "tim-watcha",
"author_login": "tim-watcha",
"committed_at": "2026-05-14T19:34:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2d19f8c752bc20591756568d2e227f050b6abea7",
"body": "When a user ID is not in the in-memory cache, message rendering\ndegrades to raw IDs and paramFormatUser fails the tool call\nentirely. This is common on Enterprise Grid workspaces where the\nuser cache (50K+ users) can be hours stale.\n\nOn cache miss, fetch the single user via users.info and patch the\n\n[…]\ncall instead of rebuilding\nthe entire user cache. Disk persistence is skipped; the next full\nrefresh cycle handles it.\n\nFixes #268\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add targeted user cache patch on miss",
"author_name": "Greg Katz",
"author_login": "gkatz2",
"committed_at": "2026-05-14T19:03:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "29a73b191abd2450ca7df9148a6beaa0386e9dbc",
"body": "feat: add blocks parameter and bump slack-go-util to v0.4.0",
"is_bot": false,
"headline": "Merge pull request #294 from arnstarn/feat/blocks-and-dep-bump",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T19:03:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5cb7c2c12c84e71bc23c1bc6855333d3ba80cdf8",
"body": "feat: extract text content from message blocks in conversations_history",
"is_bot": false,
"headline": "Merge pull request #190 from derodero24/feat/extract-block-kit-text",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T19:02:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e9f84cfbaff4286290b8608b4b1061930e1c711",
"body": "feat: add conversations_join and conversations_leave tools",
"is_bot": false,
"headline": "Merge pull request #219 from georgebashi/feat/conversations-join-leave",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:47:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e72c6bb91e5bfb0136b8db0c68a797d989c85cd",
"body": "feat: support direct user ID lookup in users_search",
"is_bot": false,
"headline": "Merge pull request #263 from Christian-Sidak/feat/users-search-by-id",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:47:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "262f0bc78efd851b47fdd864842a00e06f957022",
"body": "…hment-ids\n\nInclude file names in AttachmentIDs for message responses",
"is_bot": false,
"headline": "Merge pull request #279 from bkbaheti/fix/include-file-names-in-attac…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:47:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78005d34dacc12b7de31988c3ffdd75d6ec7e11f",
"body": "fix: return plain confirmation from conversations_add_message",
"is_bot": false,
"headline": "Merge pull request #284 from clwluvw/slack-add-msg",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:47:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5690a6a3ab75664447d56a628dfb620657898548",
"body": "fix: handle Slack refresh token format (xoxe)",
"is_bot": false,
"headline": "Merge pull request #297 from aharon-br/master",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:47:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c4614ccda587ea0b6f179d0d6f8192e5e4e7fa9",
"body": "fix: add rate limiting and retry to SearchContext",
"is_bot": false,
"headline": "Merge pull request #262 from flacoste/fix/search-rate-limit-retry",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:46:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d75398220998b9e8363089403d3cc8a5c457179e",
"body": "Include channel ID and permalink in search results",
"is_bot": false,
"headline": "Merge pull request #265 from tmastny/tim/add-permalink-and-channel-id",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:46:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a91a6183b003b04b97f256f103bd89e5d9144b3f",
"body": "…l-env-vars\n\ndocs: fix incorrect env var references for reactions and add missing tool env vars",
"is_bot": false,
"headline": "Merge pull request #245 from coolwuu/docs/fix-reaction-attachment-too…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:46:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23871daa95f4137cefc638ca1bd85931dd1ac25c",
"body": "fix: non-blocking stdio startup and --no-cache flag",
"is_bot": false,
"headline": "Merge pull request #277 from mustafa89/fix/non-blocking-stdio-startup",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-05-14T18:46:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a851750aaade8bd4e853973d2a1e0596d485454a",
"body": "re https://github.com/korotovsky/slack-mcp-server/issues/115",
"is_bot": false,
"headline": "Update api.go",
"author_name": "Harry Richman",
"author_login": "aharon-br",
"committed_at": "2026-05-13T15:25:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "090ad2ebcf98ffdc2151acae9ecf347d12e14c6f",
"body": "The conversations_history integration test returned empty messages from\nthe test workspace. The slack-go API code path is unchanged between\nv0.17.3 and v0.19.0 for this operation - likely a transient state.",
"is_bot": false,
"headline": "ci: retrigger integration tests (suspected flaky test)",
"author_name": "Arnold Mendez",
"author_login": "amendez-primer",
"committed_at": "2026-05-07T14:37:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97b24505c9c076396ca11f322a62a9dfb31a33d1",
"body": "Add optional `blocks` parameter to conversations_add_message for raw\nSlack Block Kit JSON support (rich_text lists, code blocks, etc.).\n\nWhen blocks is provided it takes precedence over text/content_type for\nmessage rendering. The text parameter serves as notification fallback.\n\nThe blocks argument \n[…]\nay to\naccommodate different MCP client serialization behaviors.\n\nAlso bumps takara2314/slack-go-util from v0.3.0 to v0.4.0 which adds\nnested list support to the existing text/markdown conversion path.",
"is_bot": false,
"headline": "feat: add blocks parameter and bump slack-go-util to v0.4.0",
"author_name": "Arnold Mendez",
"author_login": "amendez-primer",
"committed_at": "2026-05-07T14:10:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2cfccba8ca9e62d7c4074cac36e94ed04cf7f6ed",
"body": "The handler was re-fetching the just-posted message via conversations.history\nand returning it as CSV. Slack's history endpoint has propagation lag, so when\nthe message wasn't yet indexed the response was a header-only CSV with no data\nrows, which confused LLM clients into thinking the post had fail\n[…]\nturn a short success string with channel\nand ts (matching ReactionsAddHandler). This removes the race entirely and\nsaves a tier3 API call per post.\n\nSigned-off-by: Seena Fallah <seenafallah@gmail.com>",
"is_bot": false,
"headline": "fix: return plain confirmation from conversations_add_message",
"author_name": "Seena Fallah",
"author_login": "clwluvw",
"committed_at": "2026-04-26T20:01:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2666c0f8e3abe0f590857c1f34e141bfcae454f5",
"body": "… survive",
"is_bot": false,
"headline": "fix(text): preserve ZWJ/ZWNJ so emoji sequences and non-Latin scripts…",
"author_name": "Bayram Şahin",
"author_login": "byrmsh",
"committed_at": "2026-04-18T18:09:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90905ebc331f2e6e35be43fd391d6a72a6986d0c",
"body": null,
"is_bot": false,
"headline": "test(text): exercise normalizeLinks in 12-link regression case",
"author_name": "Bayram Şahin",
"author_login": "byrmsh",
"committed_at": "2026-04-17T21:29:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dd2feb887efc174038d1146b79bf605470f555e",
"body": null,
"is_bot": false,
"headline": "fix(text): preserve message content; drop vestigial char allow-list",
"author_name": "Bayram Şahin",
"author_login": "byrmsh",
"committed_at": "2026-04-17T21:18:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf4b1e81f76e1f03940b224a101168e954b01d38",
"body": "…dates\n\nBumps the github-actions group with 5 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) | `3` | `4` |\n| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3` | `4` |\n|\n[…]\n dependency-version: 0.35.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(gha): bump the github-actions group across 1 directory with 5 up…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-04-16T17:16:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cf81046419bac8c9dd7f0bcc905f9fd44f7ae579",
"body": "Previously, the AttachmentIDs field only contained raw file IDs\n(e.g. \"F08ABC1234\"), making it impossible to identify which file\nan ID corresponds to without calling attachment_get_data first.\n\nNow the field includes filenames: \"F08ABC1234 (contract.pdf)\".\nThis makes it practical to use AttachmentIDs to selectively\ndownload relevant attachments.\n\nFixes #260",
"is_bot": false,
"headline": "Include file names alongside file IDs in AttachmentIDs field",
"author_name": "Braj Baheti",
"author_login": "bkbaheti",
"committed_at": "2026-04-15T15:16:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8256b2f3438f83dfb719be97c790cc7c8ade9020",
"body": "Remove the busy-wait loop that blocks the stdio transport from\nresponding to MCP initialize until users/channels caches are fully\nloaded. On large workspaces this causes MCP clients with connection\ntimeouts (e.g. 30-60s) to drop the server.\n\nChanges:\n- stdio transport now starts the MCP server immed\n[…]\ns (never #name or @name\n lookups). This makes startup instant regardless of workspace size.\n- Add SkipCache() method on ApiProvider that marks both caches as\n ready without loading data.\n\nFixes #271",
"is_bot": false,
"headline": "fix: non-blocking stdio startup and --no-cache flag",
"author_name": "Mustafa Mujahid",
"author_login": "mustafa89",
"committed_at": "2026-04-10T13:39:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c90a87c2978a45013fdde75e0a05b404a7bce69",
"body": "The Slack search API returns both Channel.ID and Permalink on every\nSearchMessage, but the MCP server was only using Channel.Name (formatted\nas '#channel-name') and discarding the rest. This made it impossible for\nLLM agents to construct valid Slack permalink URLs.\n\n- Add Permalink field to Message struct\n- Include msg.Channel.ID in the Channel column (format: 'C0515UGHR0R (#channel-name)')\n- Pass through msg.Permalink from the Slack API response\n\nAddresses korotovsky/slack-mcp-server#100.",
"is_bot": false,
"headline": "Add channel ID and permalink to search results",
"author_name": "Tim Mastny",
"author_login": "tmastny",
"committed_at": "2026-03-30T01:03:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "869899c18e28eb4c95aefd61e9f29b8e88a347c8",
"body": "When the query matches a Slack user ID pattern (e.g., U07VCEPP4N5),\nuse the users.info API for direct lookup instead of searching by\nname/email/display name. This is useful when you already have a\nuser ID (from message metadata, mentions, etc.) and need to resolve\nit to user details.\n\nFalls back to existing search behavior for non-ID queries.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: support direct user ID lookup in users_search tool",
"author_name": "32134178csa",
"author_login": "32134178csa",
"committed_at": "2026-03-28T03:42:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "68afbcc541833de0036851529518de93b8115cb3",
"body": "SearchContext was the only Slack API call in conversations.go without\nrate limiting or retry logic. Under concurrent load (e.g. parallel\nsearches across multiple workspaces), this caused immediate failures\nwhen hitting Slack's Tier 2 rate limits.\n\nWrap the call with limiter.CallWithRetry using a Tie\n[…]\ne limiter,\nmatching the established pattern used by GetConversationHistoryContext\nand GetConversationInfoContext in the same file.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: add rate limiting and retry to SearchContext",
"author_name": "Francis J. Lacoste",
"author_login": "flacoste",
"committed_at": "2026-03-28T00:59:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4d7d872310976bc74035865635f7ff1d51b5eb80",
"body": null,
"is_bot": false,
"headline": "test: verify non-matching channels are excluded from query results",
"author_name": "unsafe9",
"author_login": "unsafe9",
"committed_at": "2026-03-25T01:31:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab1cb7d1a133d28b0afac9b4094ab32c3399144c",
"body": "Use map[string]bool instead of struct, parse inline in handler with\nwarn logging for invalid values, matching filterChannelsByTypes style.",
"is_bot": false,
"headline": "refactor: align query_targets parsing with channel_types pattern",
"author_name": "unsafe9",
"author_login": "unsafe9",
"committed_at": "2026-03-24T16:05:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "06fa3b1931ebc9ebcd38bd6b460974aa3663cff8",
"body": "Closes #251. Adds keyword filtering to channels_list so users can find\nchannels without paginating through the entire list. Matches are\ncase-insensitive substrings; query_targets controls which fields to\nsearch (name by default, optionally topic and purpose).",
"is_bot": false,
"headline": "feat: add query and query_targets parameters to channels_list tool",
"author_name": "unsafe9",
"author_login": "unsafe9",
"committed_at": "2026-03-24T15:51:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f4e7e61947f3c146278bb337cd4e384444a9067",
"body": "…tool env vars\n\nThe `reactions_add` and `reactions_remove` tools are gated by\n`SLACK_MCP_REACTION_TOOL` in the code (server.go), but the README\nincorrectly references `SLACK_MCP_ADD_MESSAGE_TOOL` for enabling them.\n\nAdditionally, `SLACK_MCP_REACTION_TOOL` and `SLACK_MCP_ATTACHMENT_TOOL`\nare missing \n[…]\n_REACTION_TOOL`\n- Fix `reactions_remove` note to reference `SLACK_MCP_REACTION_TOOL`\n- Add `SLACK_MCP_REACTION_TOOL` row to the env var table\n- Add `SLACK_MCP_ATTACHMENT_TOOL` row to the env var table",
"is_bot": false,
"headline": "docs: fix incorrect env var references for reactions and add missing …",
"author_name": "Wuu",
"author_login": "coolwuu",
"committed_at": "2026-03-20T08:06:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "18172310df8d687fa0b093652bc3457534d4f567",
"body": "The README had documentation for activity_unreads and activity_mark_read\nwhich belong to the separate feat/activity-tools branch (PR #229).\nRenumber saved-items tools to 16-18.\n\nMade-with: Cursor",
"is_bot": false,
"headline": "fix: remove activity-tools docs from saved-items branch",
"author_name": "Jonathan Zarecki",
"author_login": "jonzarecki",
"committed_at": "2026-03-15T14:27:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb4d63b944bf24f0d3e18ddd6ea3854d3f0ddd68",
"body": "Previously, attachment_get_data returned image files as base64-encoded\nstrings inside a JSON text response. For typical images (100-200KB),\nthe base64 expansion produces 130-270KB of text that exceeds MCP client\ntoken limits, forcing clients to save overflow to temp files and manually\ndecode base64 \n[…]\ndata (file_id,\nfilename, mimetype, size) is returned as the text component. Non-image\nbinary files retain the existing base64-in-text behavior.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: return image attachments as native MCP image content",
"author_name": "Valentin",
"author_login": null,
"committed_at": "2026-03-13T14:17:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "06b7e6bba3b3c12e8af281099c502d3ffe437c34",
"body": "When include_messages=true, items whose message content could not be\nfetched (e.g. channel access denied) were silently dropped from the\noutput due to a `continue` that skipped the fetched counter.\n\nChanges:\n- Move fetched++ before the includeMessages block so all items count\n- Let message fetch fai\n[…]\n- Add a note to output when some items lack message content\n- Fall back to metadata CSV when all message fetches fail\n\nFixes: 4 of 11 saved items silently dropped on enterprise Slack\nMade-with: Cursor",
"is_bot": false,
"headline": "fix: saved_list drops items when message fetch fails",
"author_name": "Jonathan Zarecki",
"author_login": "jonzarecki",
"committed_at": "2026-03-09T12:14:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3617d5ee65ebde60d226695b683ea105e521d0d3",
"body": "Add three new tools for managing Slack's \"Save for Later\" panel,\nreplacing the deprecated stars.* API (March 2023). Uses internal\nsaved.list, saved.update, and saved.clearCompleted endpoints.\n\n- saved_list: List saved items with filter (saved/completed/archived),\n auto-pagination, and optional mess\n[…]\n) and are guarded\nat registration time for bot/OAuth tokens.\n\nIncludes unit tests for CSV format, field extraction, timestamp\nformatting, parameter validation, and response parsing.\n\nMade-with: Cursor",
"is_bot": false,
"headline": "feat: add saved_list, saved_update, and saved_clear_completed tools",
"author_name": "Jonathan Zarecki",
"author_login": "jonzarecki",
"committed_at": "2026-03-08T20:07:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "110ae5a42f81ed6b97e4024ac98f28f87dd47571",
"body": "Add two new MCP tools for channel membership management:\n\n- conversations_join: Join public channels via conversations.join API.\n Idempotent — joining a channel you're already in is a no-op.\n Requires channels:join (xoxb) or channels:write (xoxp) scope.\n\n- conversations_leave: Leave channels, grou\n[…]\nelID helper.\n\nUpdated docs/01-authentication-setup.md with new OAuth scopes\n(channels:join, channels:manage) and docs/03-configuration-and-usage.md\nwith the new tool names in the available tools list.",
"is_bot": false,
"headline": "feat: add conversations_join and conversations_leave tools",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T23:20:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b24b1b08af740d5c710f556d45a5b8ba3acc0ebc",
"body": "Allow to filter out users_search tool via enabled-tools",
"is_bot": false,
"headline": "Merge pull request #213 from kirecek/master",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-03-03T21:37:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d3800035c256f41405fae91f24b33f78fadd8f0a",
"body": "…-list\n\nfix: channels_list returns empty results on Enterprise Grid with xoxc/xoxd tokens",
"is_bot": false,
"headline": "Merge pull request #218 from georgebashi/fix/enterprise-grid-channels…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-03-03T21:35:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b846b960729cdc1ce1e3d08cb961754da94a67c",
"body": "On Enterprise Grid with restricted teams, the edge API's SearchChannels\nand ClientUserBoot goroutines may fail while IMList succeeds. Since\ngoroutine errors are non-fatal (partial results kept), the edge API\nreturns only DMs with err=nil — so the standard API fallback never\ntriggers, and public/priv\n[…]\ntandard conversations.list API, deduplicating by channel ID. This\nensures we get DMs/MPIMs from the edge API AND public/private channels\nfrom the standard API regardless of which edge goroutines fail.",
"is_bot": false,
"headline": "fix: merge edge and standard API results for Enterprise Grid channels",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T20:36:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d3cec47d34dfb5cccdfa5b1889dc6cc15e8ee910",
"body": "…t flakes)",
"is_bot": false,
"headline": "ci: re-trigger integration tests (previous failures were ngrok/timeou…",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T19:47:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ba07a6fc37abcccf69d0f51c31fa163deded4bc1",
"body": "GetChannels previously called GetChannelsType in a loop, once per\nchannel type (mpim, im, public_channel, private_channel). Both the\nstandard conversations.list API and the edge API support fetching\nall types in a single request, so this loop was making 4 redundant\nround-trips.\n\nExtract getChannelsMultiType to accept a slice of channel types,\nand call it once with all types from GetChannels. GetChannelsType\nis preserved as a thin wrapper for callers that need single-type\nfetches.",
"is_bot": false,
"headline": "refactor: fetch all channel types in a single API call",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T19:31:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c93f5d4cbbb973ea1623b9a60643cc3512bca40",
"body": "When the Slack API returned no channels (due to upstream failures),\njson.MarshalIndent(nil) produced \"null\" which was written to the\ncache file. On subsequent startups, json.Unmarshal(\"null\") into a\nslice succeeds with no error, producing an empty slice that was\ntreated as valid cached data — perman\n[…]\ne defense-in-depth guards:\n- Don't write cache file when channel list is empty\n- Treat empty/null unmarshaled channels cache as invalid (refetch)\n- Same empty-cache guard for users cache (consistency)",
"is_bot": false,
"headline": "fix: prevent null cache poisoning from permanently hiding channels",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T19:31:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2caae3e0ef1aaeb45f30142dd44e4b23e4b80ef0",
"body": "For Enterprise Grid workspaces with xoxc/xoxd session tokens, the\nserver exclusively used the edge API for channel listing. If the\nedge API returned an error, the server propagated it with no\nchannels.\n\nAdd a fallback to the standard conversations.list API, which also\nworks with xoxc tokens in many Enterprise Grid setups. Cache the\nedge failure in an edgeFailed flag so that subsequent pagination\ncalls go straight to the standard API instead of retrying and\nfailing on every page.",
"is_bot": false,
"headline": "fix: fall back to standard API when edge API fails on Enterprise Grid",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T19:31:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cdcd9fe4d9676160714bf63fda72039bda3bbfea",
"body": "The edge API's GetConversationsContext runs 3 concurrent goroutines\n(ClientUserBoot, IMList, SearchChannels), then calls ClientCounts\nand ConversationsGenericInfo for MPIM discovery.\n\nPreviously, ANY failure in the pipeline discarded ALL successfully\nfetched channels:\n- A goroutine error discarded r\n[…]\nes are kept.\nOnly if all primary sources fail (0 channels collected) is the error\npropagated. MPIM discovery failures are always non-fatal since MPIMs\nare supplementary to the main channel/IM/DM data.",
"is_bot": false,
"headline": "fix(edge): collect partial results instead of discarding on errors",
"author_name": "George Bashi",
"author_login": "georgebashi",
"committed_at": "2026-03-03T19:31:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6f7acbdc3e6a73fa582e9b369a2d6a387fe50a03",
"body": "Signed-off-by: Erik Jankovič <erik.jankovic@gmail.com>",
"is_bot": false,
"headline": "chore: allow to filter out users_search tool",
"author_name": "Erik Jankovič",
"author_login": "kirecek",
"committed_at": "2026-02-27T00:32:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6681f33083f7adee8addcfc0a5e5023864ace437",
"body": null,
"is_bot": false,
"headline": "Fixed version",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-02-25T19:14:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "402d5ad12226c28560babc051c92865ec77376ec",
"body": "…hub-actions-9bddd90c58\n\ndeps(gha): bump aquasecurity/trivy-action from 0.33.1 to 0.34.0 in the github-actions group",
"is_bot": false,
"headline": "Merge pull request #208 from korotovsky/dependabot/github_actions/git…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-02-25T19:07:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d31fc389cc9265820ebf13bd04e526eae760c1e4",
"body": "…ndencies-d5fd1a410f\n\ndeps(go): bump the go-dependencies group across 1 directory with 2 updates",
"is_bot": false,
"headline": "Merge pull request #209 from korotovsky/dependabot/go_modules/go-depe…",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-02-25T19:06:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "364c9f105a8b688fed5e0b1826f2ec4dc8a227d7",
"body": "feat: add conversations_unreads and conversations_mark tools (rebased #146)",
"is_bot": false,
"headline": "Merge pull request #171 from Flare576/feat-unreads-rebase",
"author_name": "Dmitrii Korotovskii",
"author_login": "korotovsky",
"committed_at": "2026-02-25T19:06:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db396d09ca07c18ef56d2abb04bec78e33542c5f",
"body": null,
"is_bot": false,
"headline": "chore: add binaries to .gitignore and remove from tracking",
"author_name": "flare576",
"author_login": "Flare576",
"committed_at": "2026-02-23T21:42:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f50473c33c8f60a22c3d6f79b5d0089aa9386695",
"body": "…scan (#7)\n\nSwitch the xoxp unread scan from conversations.list to users.conversations.\nusers.conversations returns only channels the calling user is a member of,\neliminating non-member public channels and closed DMs that cannot have unreads.\n\nEmpirically tested on a 2700-channel workspace:\n- 37% fe\n[…]\neal unreads missed (verified against client.counts ground truth)\n- Both methods return identical channel sets for member channels\n- The 10 'missed' channels are all archived with never-visited markers",
"is_bot": false,
"headline": "perf: use users.conversations instead of conversations.list for xoxp …",
"author_name": "Manuel Kreutz",
"author_login": "140am",
"committed_at": "2026-02-23T15:40:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b540e8ee16dec2c319ade5202714319d59ae42ff",
"body": "The includeMessages loop in getUnreadsViaConversationsInfo calls\nGetConversationHistoryContext with no rate limiter and no retry — the\nonly conversations.history call in the xoxp path not wrapped in\nCallWithRetry.\n\nWhen include_messages=true and multiple unread channels are found,\nthese calls fire u\n[…]\nthrottled, risking 429s that silently skip channels\nand lose messages.\n\nFix: add a local Tier 3 rate limiter and wrap in CallWithRetry,\nmatching the pattern used everywhere else in the xoxp scan path.",
"is_bot": false,
"headline": "fix: add rate limiting and retry to includeMessages history calls (#5)",
"author_name": "Manuel Kreutz",
"author_login": "140am",
"committed_at": "2026-02-19T22:25:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "53e7f03443d516e4beabcf7027ba100eace5ed82",
"body": "…dates\n\nBumps the go-dependencies group with 2 updates in the / directory: [github.com/mark3labs/mcp-go](https://github.com/mark3labs/mcp-go) and [golang.org/x/net](https://github.com/golang/net).\n\n\nUpdates `github.com/mark3labs/mcp-go` from 0.43.2 to 0.44.0\n- [Release notes](https://github.com/mark\n[…]\n dependency-version: 0.50.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n dependency-group: go-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(go): bump the go-dependencies group across 1 directory with 2 up…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-02-19T17:17:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c788000a1d903a6dedbdc5235c7422998f4d754",
"body": "Bumps the github-actions group with 1 update: [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action).\n\n\nUpdates `aquasecurity/trivy-action` from 0.33.1 to 0.34.0\n- [Release notes](https://github.com/aquasecurity/trivy-action/releases)\n- [Commits](https://github.com/aquasecurity/tr\n[…]\n dependency-version: 0.34.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "deps(gha): bump aquasecurity/trivy-action in the github-actions group",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-02-19T17:17:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7224ff65ca570f6d838dc30cee2002c1559131fc",
"body": "…o/history calls (#4)\n\nThe xoxp fallback in conversations_unreads calls GetConversationInfoContext\nper channel to check for unreads. slack-go's standard Client does NOT\nauto-retry on HTTP 429 — it returns *slack.RateLimitedError to the caller.\n\nThe scan loop handled ALL errors with continue at Debug\n[…]\n WARNING when channels are skipped\n- Rate limit errors promoted from Debug to Warn level\n- 8 unit tests in pkg/limiter covering retry logic, exhaustion,\n context cancellation, and typed return values",
"is_bot": false,
"headline": "fix: add proactive rate limiting and retry for xoxp conversations.inf…",
"author_name": "Manuel Kreutz",
"author_login": "140am",
"committed_at": "2026-02-16T21:55:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "43a2ec1145be5280854fbf9e5dd4e06f60ec6741",
"body": "* fix: pre-check token type to avoid faulty ClientCounts call\n\nclient.counts only works with browser session tokens (xoxc/xoxd). OAuth\ntokens (xoxp) get 'not_allowed_token_type' and bot tokens (xoxb) have no\nconcept of user-level unreads.\n\nInstead of calling ClientCounts and catching the error after\n[…]\ng the established pattern used by\nevery other tool in the server. This prevented selective enable/disable\nvia the enabledTools config.\n\nAlso fixes indentation on conversations_mark registration block.",
"is_bot": false,
"headline": "fix: token-type routing and validation for conversations_unreads (#3)",
"author_name": "Manuel Kreutz",
"author_login": "140am",
"committed_at": "2026-02-13T20:01:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3e0e4ea79255f58e1322bc44a88d88ad05ceb44d",
"body": "* fix: use index-based range loop so unread counts persist\n\nThe message-fetch loop uses 'for _, uc := range unreadChannels', so\nwrites to uc.UnreadCount go to a copy — the original slice element\nstays at 0. Messages are fetched correctly (appended to a separate\nslice), but the unread count column is\n[…]\now muted channels when\nexplicitly requested.\n\nMuted status is only available in users.prefs.get as a nested JSON\nstring — it is not exposed by client.counts, conversations.info, or\nconversations.list.",
"is_bot": false,
"headline": "fix: unread count persistence + backfill + muted channel filtering (#2)",
"author_name": "Manuel Kreutz",
"author_login": "140am",
"committed_at": "2026-02-12T01:43:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e43380f89a092d3c378700c650713572cdba170a",
"body": "ClientCounts was not calling baseResponse.validate() after ParseResponse,\nso when xoxp tokens received HTTP 200 with {\"ok\": false, \"error\":\n\"not_allowed_token_type\"}, no Go error was raised and the xoxp fallback\npath never triggered. Users saw \"0 unreads\" silently.\n\nThis follows the pattern used in search.go which correctly validates.\n\nCredit: @140am for identifying the issue and providing the fix.",
"is_bot": false,
"headline": "fix: validate ok field in ClientCounts to trigger xoxp fallback",
"author_name": "flare576",
"author_login": "Flare576",
"committed_at": "2026-02-11T23:46:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e238772b7e5361dcf75a3e223b147897c66ac49e",
"body": "…ations.info\n\nCo-authored-by: niebloomj <5156403+niebloomj@users.noreply.github.com>",
"is_bot": false,
"headline": "feat: add xoxp token fallback for conversations_unreads using convers…",
"author_name": "flare576",
"author_login": "Flare576",
"committed_at": "2026-02-11T23:11:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cbbecb270c07c361fe5abe34fa0619a5c3d608e",
"body": "- Extract handler params to structs with parsing functions\n (unreadsParams, markParams) following existing patterns\n- Add SLACK_MCP_MARK_TOOL env var guard for conversations_mark\n (disabled by default, requires explicit opt-in)\n- Remove unused categorizeChannel and getChannelDisplayName functions\n- Update README with conversations_mark safety note and env var docs",
"is_bot": false,
"headline": "refactor: address PR review feedback",
"author_name": "Saoud Rizwan",
"author_login": "saoudrizwan",
"committed_at": "2026-02-11T23:10:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0cd8fd5d2ddcd3bf8d39496d1fe2a322a30ae09d",
"body": null,
"is_bot": false,
"headline": "docs: add conversations_unreads and conversations_mark to README",
"author_name": "Saoud Rizwan",
"author_login": "saoudrizwan",
"committed_at": "2026-02-11T23:10:47Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 1,
"commits_last_year": 261,
"latest_release_at": "2026-07-17T17:25:54Z",
"latest_release_tag": "v1.4.0",
"releases_from_tags": false,
"days_since_last_push": 4,
"active_weeks_last_year": 35,
"days_since_latest_release": 4,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/c3-oss/slack-mcp-server",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/c3-oss/slack-mcp-server",
"is_deprecated": false,
"latest_version": "v1.4.0",
"repository_url": "https://github.com/c3-oss/slack-mcp-server",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-17T17:21:58Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0
},
"open_issues_and_prs": 3
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 87068,
"source_files_sampled": 44,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"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": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/gocarina/gocsv",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20240520201108-78e41c74b4b1"
},
{
"name": "github.com/google/uuid",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/mark3labs/mcp-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.44.0"
},
{
"name": "github.com/mattn/go-isatty",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.20"
},
{
"name": "github.com/openai/openai-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.12.0"
},
{
"name": "github.com/refraction-networking/utls",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.8.2"
},
{
"name": "github.com/rusq/slack",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.9.6-0.20250408103104-dd80d1b6337f"
},
{
"name": "github.com/rusq/slackauth",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.7.1"
},
{
"name": "github.com/rusq/slackdump/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.1.13"
},
{
"name": "github.com/rusq/tagops",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.1.1"
},
{
"name": "github.com/slack-go/slack",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.19.0"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/takara2314/slack-go-util",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.4.0"
},
{
"name": "go.uber.org/zap",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.27.1"
},
{
"name": "golang.ngrok.com/ngrok/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.1.1"
},
{
"name": "golang.org/x/net",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.50.0"
},
{
"name": "golang.org/x/sync",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.19.0"
},
{
"name": "golang.org/x/time",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.14.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 3,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "korotovsky",
"commits": 296,
"avatar_url": "https://avatars.githubusercontent.com/u/104727?v=4"
},
{
"type": "User",
"login": "Flare576",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/15177870?v=4"
},
{
"type": "User",
"login": "georgebashi",
"commits": 10,
"avatar_url": "https://avatars.githubusercontent.com/u/172470?v=4"
},
{
"type": "User",
"login": "upsetbit",
"commits": 9,
"avatar_url": "https://avatars.githubusercontent.com/u/12755789?v=4"
},
{
"type": "User",
"login": "saoudrizwan",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/7799382?v=4"
},
{
"type": "User",
"login": "140am",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/23227?v=4"
},
{
"type": "User",
"login": "aron-muon",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/202663813?v=4"
},
{
"type": "User",
"login": "koladev32",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/32314456?v=4"
},
{
"type": "User",
"login": "Graf2242",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/16004523?v=4"
},
{
"type": "User",
"login": "watersaber",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/110132758?v=4"
}
],
"contributors_sampled": 52,
"top_contributor_share": 0.695
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"release.yml",
"security-trivy.yaml",
"unit-tests.yaml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"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/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 7 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"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": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "27 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "b91891f7b396db29522763608f02155f8381b75f",
"ran_at": "2026-07-22T06:24:44Z",
"aggregate_score": 3.4,
"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-17T17:49:59Z",
"oldest_open_prs": [
{
"number": 1,
"created_at": "2026-07-17T17:24:00Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 2,
"created_at": "2026-07-17T17:24:12Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3,
"created_at": "2026-07-17T18:28:25Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/c3-oss/slack-mcp-server",
"host": "github.com",
"name": "slack-mcp-server",
"owner": "c3-oss"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"security": 34,
"vitality": 77,
"community": 24,
"governance": 40,
"engineering": 66
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"commits_last_year": 261,
"human_commit_share": 0.96,
"days_since_last_push": 4,
"active_weeks_last_year": 35
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "35/52 weeks with commits",
"points": 24.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 35
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "261 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 261
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v1.4.0",
"releases_from_tags": false,
"days_since_latest_release": 4,
"mean_days_between_releases": null
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "1 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 1
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "cadence unknown (single release)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence_unknown",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"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": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 40,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 39,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 52,
"top_contributor_share": 0.695
},
"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 70% of commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 70
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "52 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 52
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 7 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "c3-oss",
"public_repos": 13,
"account_age_days": 478
},
"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": "1 followers of c3-oss",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "c3-oss"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "13 public repos, account ~1 yr old",
"points": 11,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 13
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "good",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"packages": [
"github.com/c3-oss/slack-mcp-server"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 4
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "1 published versions",
"points": 4,
"status": "partial",
"details": [
{
"code": "published_versions",
"params": {
"count": 1
}
}
],
"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": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"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": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": 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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "at_risk",
"name": "Security",
"value": 34,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 34,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 3.4
},
"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 not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 7 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "27 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 8
},
"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": 61,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.917,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "88 of 96 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 88,
"sampled": 96
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 79,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.22,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0.04
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"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": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "22 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 22,
"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": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 87068,
"source_files_sampled": 44,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/44 source files over 60KB",
"points": 53.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 44,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "critical",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"example_dirs": [],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-22T06:25:00.497323Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/c3-oss/slack-mcp-server.svg",
"full_name": "c3-oss/slack-mcp-server",
"license_state": "standard",
"license_spdx": "MIT"
}