standup-mr
Collect merge-request-based standup data from GitLab or GitHub via the get_standup_data MCP tool.
Fetches the previous working day's activity.
Buckets open merge/pull requests into ready, blocked, draft, and stale states.
Lists pending reviews, excluding already-approved ones.
Pulls error lines from failed pipelines or checks to explain blockers.
Supports both GitLab and GitHub, including self-hosted instances.
Returns raw structured data; writing the final standup note is left to an AI assistant or client.
standup-mr
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.
What makes it different
commit-log tools | standup-mr | |
Source | local | GitLab 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) | varies | first class |
Related MCP server: Git Insight MCP
Use
npx standup-mr fetch # JSON, provider auto-detected
npx standup-mr fetch --provider github # GitHub
npx standup-mr fetch --provider gitlab # GitLab
npx standup-mr fetch --markdown # structured digest
npx standup-mr fetch --lang tr # Turkish date labelsIdentity
GitHub | GitLab | |
Flags |
|
|
Env |
|
|
CLI session |
|
|
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:
--provider github/--provider gitlab, if passeda recognizable
--host(github.com,gitlab.com, or a hostname containinggithub/gitlab)STANDUP_PROVIDER, or whichever of theGITHUB_*/GITLAB_*env pairs is setwhichever of
gh/glabis 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
npx standup-mr fetch --markdown | npx standup-mr post --slack "$SLACK_WEBHOOK_URL"The three surfaces
CLI — the core. Emits JSON; zero runtime dependencies.
MCP server (mcp/) — one tool, get_standup_data, for Claude Desktop,
Cursor, or any MCP client. See mcp/README.md.
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-mrThen 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):
{
"mcpServers": {
"standup": {
"command": "npx",
"args": ["-y", "standup-mr", "mcp"],
"env": {
"GITHUB_TOKEN": "ghp_..."
}
}
}
}Codex — add to ~/.codex/config.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 tool only returns data; the assistant still needs the note-writing rules
that the Claude Code skill carries. Paste them into whatever instructions
file your assistant reads (e.g. AGENTS.md):
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:
# 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.
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 adiagnosis 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:
previousandpreviousEventsare replaced bypreviousDays[], one entry per active day, so a weekend no longer swallows Friday.jq .previousnow returnsnullwith no error.MergeRequest,ReviewandBlockercarry a requiredproviderfield, andProvider.getReviewstakes anIdentityrather than a numeric id.The MCP
CollectOptions.provideris now a provider name; inject aProviderinstance throughproviderImpl.
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
Available Tools
1 toolget_standup_dataA
Collect merge-request-based standup data from GitLab or GitHub. Returns the previous working day activity, open merge requests or pull requests bucketed by state (ready / blocked / draft / stale), pending reviews, and the error lines from any failed pipeline or check. Credentials come from the environment or a logged-in gh / glab session, never from an argument.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Self-hosted host, without a scheme, e.g. gitlab.example.com or github.example.com. GitHub defaults to github.com; GitLab has no default, so self-hosted GitLab needs this or GITLAB_HOST. | |
| lang | No | Language for the date labels inside the returned JSON. Defaults to en. Only the labels change — the standup note itself is written by the caller. | |
| provider | No | Which provider to read. Omit to auto-detect, in this order: a recognisable host, STANDUP_PROVIDER, a GITHUB_*/GITLAB_* environment pair, then whichever of the gh / glab CLIs is logged in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It clearly states what data is returned, how activity is scoped (previous working day), how open items are bucketed, and that credentials come from the environment or logged-in gh/glab sessions rather than arguments. It does not mention failure modes or rate limits, but the key operational behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loads the core purpose and return contents, and closes with an important credential-safety note. No sentence is wasted, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains both what the tool returns and where credentials come from, which is essential given no output schema and no annotations. It does not document exact output formatting or failure behavior, but the return contents are described in enough detail for an agent to know what to expect. The optional parameters are fully covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters well. The description adds useful context about credential sourcing, which relates to host and provider behavior, but it does not add significant parameter-level semantics beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Collect') and resource ('merge-request-based standup data from GitLab or GitHub'), and enumerates the exact returned content: previous working day activity, open MRs/PRs bucketed by state, pending reviews, and failed pipeline error lines. This is unambiguous and fully distinguishes the tool's purpose even without sibling tools to compare against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for collecting standup-related data from GitLab or GitHub, but it does not explicitly state when to use it versus alternatives or when not to use it. There are no sibling tools and no direct usage conditions, so the usage context is only implied by the tool's name and return-value description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
There is only one tool, so there is no possibility of an agent confusing it with another. The tool's purpose is clearly stated and self-contained.
The single tool name follows the standard verb_noun convention with a descriptive action and object. With only one tool, there are no conflicting patterns to evaluate.
The server is narrowly scoped to retrieving standup data, and one comprehensive tool covers that purpose well. It is slightly thin compared to typical multi-tool servers, but the count feels reasonable rather than trivial.
The tool covers the complete standup workflow: previous day activity, open MR/PR states, pending reviews, and failed pipeline errors across both GitLab and GitHub. No obvious gaps exist for the stated domain.
Maintenance
Related MCP Connectors
Opinionated sprint tracker. Read/update tickets, sprints, velocity from Claude/Cursor/Zed.
Freeze and unfreeze merges across a GitHub organization, with an audit trail.
Generate and publish changelogs, blog posts, release emails, and social posts from your commits.
Pull change requests from your Amendor board into your coding agent to build and open PRs.
Related MCP Servers
- AlicenseBqualityDmaintenanceGenerates standup reports from git history by analyzing recent commits across configured repositories. Enables users to query their development activity, such as what they worked on yesterday or over multiple days, through natural language interactions with Claude.2MIT
- AlicenseAqualityCmaintenanceSemantic git queries via MCP. Beyond git log — answer who/what/why about any line, file, or branch with blame, co-change, PR linkage.6192MIT
- FlicenseNot gradedqualityDmaintenanceSummarizes Slack activity and GitLab merge requests with OpenAI to help generate daily standups, weekly reports, or quarterly check-ins.
- AlicenseAqualityCmaintenancePython MCP server for GitHub operations, providing native tool integration with Claude Code and other MCP clients. It enables managing issues, pull requests, CI status, milestones, and batch operations via natural language.15MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Jubstaaa/standup-mr'
If you have feedback or need assistance with the MCP directory API, please join our Discord server