Standup Mr

io.github.Jubstaaa由 GitHub 帳號 Jubstaaa 發布v1.1.1更新於 Oct 28, 2026

Standup notes from merge request state, with the failed job's error lines.

已驗證Streamable HTTP可網頁執行開發者工具溝通與協作

概覽

AI 產生的概覽

讀取 GitHub 或 GitLab 的合併請求狀態,包含失敗流水線的錯誤行,讓助理據此撰寫並發布站立會議摘要。

可以做什麼
  • 以 JSON 取得 GitHub 或 GitLab 的站立會議資料:可合併、受阻、草稿與過期的合併請求、待處理審查以及阻擋項目
  • 開啟失敗流水線的工作日誌,回傳說明合併請求為何受阻的錯誤行
  • 回傳摘要撰寫規則,讓助理把整理結果寫成可朗讀的站立會議摘要
  • 把寫好的摘要張貼到 Slack、Discord 或 Google Chat 的 webhook
適用情境
適合需要依倉庫中真正可合併、受阻或等待審查的內容產生每日站立會議摘要,而非依據本機提交紀錄的情境。也適合在不手動開啟工作日誌的情況下快速查明流水線為何失敗。
執行需求
可使用具 OAuth 登入的遠端託管端點(無需權杖),或在本機以 Node 20 以上版本執行 npm 套件。本機使用需透過 GITHUB_HOST/GITHUB_TOKEN 或 GITLAB_HOST/GITLAB_TOKEN 提供主機與權杖,或已有 gh/glab 命令列登入工作階段;GitLab 必須提供 GITLAB_HOST。張貼摘要需在 STANDUP_WEBHOOK_URL 設定 webhook 網址。需要能連線至服務商 API 的網路。
安裝前請注意
本機伺服器持有可讀取合併請求的服務商權杖(GITHUB_TOKEN、GITLAB_TOKEN);託管伺服器會加密儲存這些權杖,並以雜湊形式保存存取權杖。STANDUP_WEBHOOK_URL 中的 webhook 網址一旦外流,任何人都能對該頻道發文。post_standup_note 會把摘要送往第三方聊天服務。GitHub 的事件串流容量有限,私有倉庫活動只有同一帳號的權杖才看得到。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Standup Mr,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.Jubstaaa%2Fstandup-mr/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "standup-mr": {
      "type": "http",
      "url": "https://standup.ilkerbalcilar.com/mcp"
    }
  }
}

README

standup-mr

[standup-mr MCP server] [Listed on mcpservers.org] [smithery badge] [mcprush grade]

Standup notes from merge request state, not commit logs.

Most standup tools read your local git log. That answers "what did I type", which is not what anyone asks in a standup. This one reads GitLab or GitHub: what is ready to merge, what is blocked, what is waiting on you — and when a pipeline is red, it opens the job log and tells you why.

[standup-mr reading a GitLab project: ready, blocked, draft, and the error line from a failed job]

What makes it different

commit-log toolsstandup-mr
Sourcelocal git logGitLab or GitHub API
Merge request state✗ready / blocked / draft / stale
Review queue✗pending only, approvals filtered out
Failed pipeline✗error lines from the job trace or the Actions job log
Self-hosted (GitLab CE/EE, GitHub Enterprise)variesfirst class

Use

bash
npx standup-mr fetch                            # JSON, provider auto-detectednpx standup-mr fetch --provider github          # GitHubnpx standup-mr fetch --provider gitlab          # GitLabnpx standup-mr fetch --markdown                 # structured digestnpx standup-mr fetch --lang tr                  # Turkish date labels
bash
npx standup-mr fetch --markdown | npx standup-mr post --google-chat "$URL"

Identity

GitHubGitLab
Flags--host / --token--host / --token
EnvGITHUB_HOST / GITHUB_TOKENGITLAB_HOST / GITLAB_TOKEN
CLI sessiongh auth configglab auth config

GitHub defaults to github.com when no host is given. GitLab has no default — self-hosted is the norm there, so a host must come from a flag, env var, or glab's own config.

The provider itself is picked in this order:

  1. --provider github / --provider gitlab, if passed
  2. a recognizable --host (github.com, gitlab.com, or a hostname containing github/gitlab)
  3. STANDUP_PROVIDER, or whichever of the GITHUB_* / GITLAB_* env pairs is set
  4. whichever of gh / glab is logged in

If none of these resolve — or both do, ambiguously — the command fails with a clear error instead of guessing.

So if you already use gh or glab, there is nothing to configure.

Post it to chat

bash
npx standup-mr fetch --markdown | npx standup-mr post --slack "$SLACK_WEBHOOK_URL"

Hosted connector: any AI assistant

No token, no config file — sign in instead. The hosted server speaks the standard MCP OAuth flow, so any assistant that supports remote MCP servers can use it: add the URL, and a browser page opens where you sign in.

https://standup.ilkerbalcilar.com/mcp

[Add to Cursor] [Install in VS Code]

AssistantHow
claude.ai (web, mobile, Desktop)Settings → Connectors → Add custom connector → paste the URL → Connect
Claude Codeclaude mcp add --scope user --transport http standup https://standup.ilkerbalcilar.com/mcp, then /mcp to sign in
CursorThe button above, or "standup": { "url": "https://standup.ilkerbalcilar.com/mcp" } in ~/.cursor/mcp.json
VS Code (Copilot)The button above, or "standup": { "type": "http", "url": "https://standup.ilkerbalcilar.com/mcp" } in mcp.json
Gemini CLIgemini extensions install https://github.com/Jubstaaa/standup-mr, then /mcp auth standup
Codex CLIcodex mcp add standup --url https://standup.ilkerbalcilar.com/mcp, then codex mcp login standup
ChatGPTWith developer mode on: Settings → Apps → Create → paste the URL, OAuth

claude.ai and Claude Code are tested end to end; the others use the same standard flow. If one of them doesn't sign in, please open an issue.

On the sign-in page you link the accounts the note should read:

  • GitHub — sign in through the standup-mr GitHub App. It only sees the repositories it is installed on, so install it on your org too; if the org won't approve it, add github.com with a fine-grained token instead.
  • gitlab.com — sign in with GitLab.
  • Your company's GitLab or GitHub Enterprise — type the host. If someone at your company already set up sign-in, you get a "Sign in with …" button. Otherwise set it up once: the page shows the exact redirect URI and scopes for an OAuth application on your host, you paste its ID and secret, and everyone at that host can sign in from then on. A read-only token works too.
  • Chat webhook (optional) — Slack, Discord or Google Chat, so your assistant can post the finished note when you ask it to.

Link as many as you like — say, GitHub for side projects and your company's GitLab for work — then ask for "my standup" or "my work standup". With several accounts linked, the assistant asks which one you mean.

Added in an assistant with a mobile app — Claude or ChatGPT — it works from your phone too: ask for your standup on the way to the meeting.

What is stored. Your provider tokens and webhook URL, encrypted with AES-256-GCM, and only to read your merge requests and post your note. The access tokens your assistant holds are stored as hashes. Disconnecting it deletes everything; connections unused for 30 days are deleted. The server is the code in remote/.

When to use the local server instead. A GitLab behind a VPN or on a private network is out of reach of a hosted server. Run the stdio server below on your own machine — the token never leaves it.

The four surfaces

CLI — the core. Emits JSON; zero runtime dependencies.

MCP server (mcp/) — three tools for Claude Desktop, Claude Code, Cursor, or any MCP client that runs a local process. See mcp/README.md.

Remote MCP server (remote/) — the same tools over HTTPS with sign-in, for any assistant that supports remote MCP servers, including the web and mobile apps. See above.

Claude Code plugin — the note-writing playbook, shipped as the standup skill. From inside Claude Code:

/plugin marketplace add Jubstaaa/standup-mr/plugin install standup@standup-mr

Then type /standup. Updates come with /plugin marketplace update standup-mr.

Using it from Cursor, Codex, or another assistant

If you're not using Claude Code, wire up the MCP server for live data and paste in the note-writing rules separately.

Cursor — add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project-local):

json
{    "mcpServers": {        "standup": {            "command": "npx",            "args": ["-y", "standup-mr", "mcp"],            "env": {                "GITHUB_TOKEN": "ghp_..."            }        }    }}

Codex — add to ~/.codex/config.toml:

toml
[mcp_servers.standup]command = "npx"args = ["-y", "standup-mr", "mcp"]
[mcp_servers.standup.env]GITHUB_TOKEN = "ghp_..."

The exact config key and file path are version-dependent for both clients — if a snippet above doesn't work, check Cursor's MCP docs or Codex's own config documentation for the current format rather than trusting this file blindly.

The server exposes three tools:

ToolWhat it does
get_standup_dataReads the provider and returns the report as JSON. Optional provider, host, lang.
get_note_instructionsReturns the note-writing rules, so the assistant can write the note the way the skill would.
post_standup_notePosts a finished note to a Slack, Discord or Google Chat webhook.

post_standup_note reads the webhook URL from STANDUP_WEBHOOK_URL and never takes it as an argument — anyone holding that URL can post to the channel, so it belongs with the tokens, not in a transcript. The payload shape is inferred from the URL host; kind is only needed when a proxy hides it.

Three shapes are implemented: slack and google-chat both post {"text"}, discord posts {"content"}.

Slack and Google Chat do not render standard Markdown, so the note is rewritten on the way out: **bold** becomes *bold* and a ## heading becomes a bold line. Inline code, fenced blocks and their contents are left alone. Discord speaks Markdown natively and is sent untouched. Anything else that accepts a Slack-shaped body — Mattermost, Rocket.Chat, an n8n or Zapier endpoint — works today by passing kind: "slack", or --slack URL on the CLI.

Outside MCP, the same rules are available on stdout:

bash
npx standup-mr instructions >> AGENTS.md

--markdown is a digest, not a written note

--markdown organizes the raw material into readable sections. It does not group events into themes or diagnose blockers — that is the model's work, and it lives in the MCP client's prompt or in the Claude Code skill.

  • Without AI: a structured digest.
  • With AI: a note you can read out.

What the digest looks like

Anonymised output from a real Monday run — note that Friday and Saturday each get their own section, and that a merge request GitLab has not evaluated is not called ready:

markdown
# Monday, 31 August — dev
_Structured digest — not a written note._
## Previous working day: Friday, 28 August
- `acme/ui` pushed to — fix(keyboard): scale keys to viewport (4 commits)- `acme/ui` accepted — chore(deps): bump @acme/ui to 0.5.18- `acme/api` opened — feat: package subscription sales
## Previous working day: Saturday, 29 August
- `acme/ui` pushed to — fix(keyboard): close the autofill bar (1 commit)
## Ready to merge (2)
- `acme/api` !196 fix: normalise the +90 trunk prefix- `acme/web` !194 refactor: loading state — **no pipeline ran**
## Blocked (1)
- `acme/terminal` !49 fix: relative date chips — **1 unresolved comment(s)**
## Reviews (2 pending)
- `acme/mobile` !501 chore: upgrade to RN 0.87 — Teammate
## Blockers
- `acme/mobile` !6 — job `quality`    - `npm ERR! code E404`    - `npm ERR! 404 Not Found - GET https://registry.example.com/@acme%2fui`

The last section is the point of the tool. Every other standup tool can tell you that pipeline is red; this one opens the failed job's log and shows you the 404 — and a 404 rather than a 403 usually means the token's scope is wrong, not that the package is missing.

Stability

Since 1.0.0 the CLI commands and flags, the JSON that fetch and get_standup_data return, the MCP tool names and arguments, and the environment variables follow semantic versioning: a change that would break an existing setup waits for a major release. New fields in the JSON may appear in minor releases, so read it by name rather than by position. The hosted server at standup.ilkerbalcilar.com is updated continuously and is not tied to the npm version.

Known limits

  • GitHub's events feed is shallow. It is capped at roughly 300 events over the last 90 days, so a very active account or an old gap can silently lose the earliest events. GitLab has no comparable documented cap.
  • GitHub activity is only visible to a token belonging to that same account, and private-repository events do not show up for anyone else's token, even with otherwise sufficient scopes.
  • On GitHub, CI that reports only through the legacy commit-statuses API — still how some vendors integrate — shows up as pipelineMissing. Check state is read from check-runs only.
  • A blocker whose diagnosis could not be fetched is still reported, as job: "unknown" with a diagnosis unavailable: … error line. The merge request is blocked either way; only the explanation is missing. Server errors are retried twice first, and a rejected token still fails the run.

Upgrading from 0.1.x

0.2.0 changes the JSON output, the library API, and the MCP options. If you pipe standup fetch into anything, or import the package, read CHANGELOG.md before upgrading. The short version:

  • previous and previousEvents are replaced by previousDays[], one entry per active day, so a weekend no longer swallows Friday. jq .previous now returns null with no error.
  • MergeRequest, Review and Blocker carry a required provider field, and Provider.getReviews takes an Identity rather than a numeric id.
  • The MCP CollectOptions.provider is now a provider name; inject a Provider instance through providerImpl.

Claude Code plugin users should run /plugin marketplace update standup-mr — the standup skill changed along with the report shape.

Requirements

Node 20 or newer. The CLI core (fetch, post, instructions) pulls no runtime dependencies. The MCP server (mcp command) brings one: @modelcontextprotocol/sdk.

License

MIT

來源:README.md,提交 475ad20

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

4
  1. v1.1.1最新Oct 13, 2026
  2. v1.1.0Oct 12, 2026
  3. v0.7.0Oct 11, 2026
  4. v0.6.1Sep 16, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分