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.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
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: Slack Gitlab Digest Model Context Protocol MCP Server
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 labelsnpx standup-mr fetch --markdown | npx standup-mr post --google-chat "$URL"Identity
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"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
Assistant | How |
claude.ai (web, mobile, Desktop) | Settings → Connectors → Add custom connector → paste the URL → Connect |
Claude Code |
|
Cursor | The button above, or |
VS Code (Copilot) | The button above, or |
Gemini CLI |
|
Codex CLI |
|
ChatGPT | With 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-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 server exposes three tools:
Tool | What it does |
| Reads the provider and returns the report as JSON. Optional |
| Returns the note-writing rules, so the assistant can write the note the way the skill would. |
| Posts 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:
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.
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 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
3 toolsget_note_instructionsGet note instructionsARead-onlyIdempotentInspect
Returns the note-writing rules — the playbook for turning get_standup_data output into a standup note a person would actually say out loud: how to group the previous day by theme, how to derive today from open merge requests, and how to report a blocker from its job log. Read-only, no arguments, no network. Call it once before writing the first note; the rules do not change between calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered; 'Read-only, no arguments, no network' largely restates them. The description earns credit by disclosing the actual content of the returned rules (grouping the prior day by theme, deriving today from open merge requests, reporting a blocker from its job log), which the agent cannot learn elsewhere.
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?
Front-loads what is returned, then the workflow guidance, in two tight sentences with no wasted preamble. The 'Read-only, no arguments, no network' clause is partially redundant with the annotations and schema, which keeps it from a 5.
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?
With no output schema, the description carries the burden of conveying what comes back, and it does so by enumerating the three rule areas the playbook covers. An agent knows what it gets and how to use it; only the exact response format is left unspecified, which is minor for an instruction-fetch tool.
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?
There are zero parameters, so the baseline is 4. The description's 'no arguments' is consistent with the empty input schema and leaves no ambiguity about how to call it.
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?
States a specific verb+resource (returns note-writing rules) and immediately scopes it as the playbook for transforming get_standup_data output into a standup note. This distinguishes it cleanly from the siblings get_standup_data and post_standup_note without the agent needing to open any schema.
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?
Explicitly says to call it once before writing the first note and that the rules do not change between calls, which tells the agent when to invoke it and when not to repeat it. It does not explicitly name the alternative tools for other workflow steps, so it falls just short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_standup_dataGet standup dataARead-onlyIdempotentInspect
Collect merge-request-based standup data from GitLab or GitHub. Returns one JSON object: today, previousDays[] with the events of each, todayEvents[], myMrs[] bucketed ready / blocked / draft / stale, reviews[] waiting on you, and blockers[] carrying the error lines read out of each failed pipeline job log.
Call it once at the start of a working day, to write a standup note. It is a snapshot, not a search API: it cannot fetch one named merge request, reach further back than the previous working day, or filter by project.
Read-only, and credentials never come from an argument — they come from the environment or a logged-in gh / glab session. A rejected token, a refused resource or a rate limit fails the call with the host's own message, after two retries on transient server errors. A blocker whose diagnosis could not be fetched is still returned, with job: "unknown", so a red pipeline is never silently dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Self-hosted host, without a scheme, e.g. gitlab.example.com or github.example.com. Required for GitLab, which has no default host; optional for GitHub, which defaults to github.com. A recognisable host also settles `provider` on its own, so the two are rarely both needed. | |
| lang | No | Language for the date labels inside the returned JSON: en (default) or tr. It relabels dates and nothing else — no field is translated, and the standup note itself is written by the caller, in whatever language they are speaking. | |
| 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. Pass it when both are configured — ambiguity fails the call rather than being guessed at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: credentials come from the environment or a gh/glab session and never from an argument, failures (rejected token, refused resource, rate limit) surface the host's own message after two retries on transient server errors, and a blocker whose log could not be read is still returned with job: "unknown" so failures are never silently dropped. This is exactly the operational context an agent cannot get from readOnlyHint/openWorldHint.
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?
Front-loads what it collects and returns, then usage, then behavior; each sentence carries information. The return-shape enumeration is long, but it substitutes for a missing output schema, so it largely earns its space.
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?
With no output schema, the description supplies the return structure, and it covers auth sourcing, retry policy, error surfacing, and degraded-output behavior. Nothing an agent needs to call this correctly appears to be missing.
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%, and each of host/lang/provider is fully documented in the schema, including auto-detection order and enum values. The description adds only the tangential note that credentials are not a parameter, so 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?
States a specific verb and resource (collect merge-request standup data from GitLab/GitHub) and enumerates the returned buckets (today, myMrs ready/blocked/draft/stale, reviews, blockers). This clearly separates it from the sibling post_standup_note, which writes rather than reads.
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?
Gives an explicit when ('Call it once at the start of a working day, to write a standup note') and explicit when-not ('it cannot fetch one named merge request, reach further back than the previous working day, or filter by project'). The boundaries of the tool are stated rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_standup_notePost standup noteAInspect
Posts a finished standup note to a chat webhook. This one has a side effect: it sends a message other people will see, so only call it on a note the user has agreed to send.
The webhook URL is read from STANDUP_WEBHOOK_URL, never from an argument — a webhook URL is a credential, since anyone holding it can post to the channel. Slack and Discord payload shapes are supported; the shape is inferred from the URL host, and kind is only needed for a proxied or self-hosted endpoint whose host gives nothing away — Mattermost and Rocket.Chat take the slack shape. A missing URL, an unrecognised host, or a webhook that rejects the message comes back as an error rather than a silent success.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which payload shape to send: slack and google-chat post {"text"}, discord posts {"content"}. Omit it — the shape is inferred from the webhook host. Pass it only when the host is not recognisable, e.g. a proxy in front of the real webhook. | |
| text | Yes | The note to post, as the chat should render it. Slack and Discord both take Markdown, so send the written note rather than the raw JSON from get_standup_data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/open-world/non-idempotent profile, but the description adds real context on top: the message is publicly visible, the webhook URL is a credential read from STANDUP_WEBHOOK_URL and deliberately not an argument, host-based payload inference, and that failures surface as errors rather than silent success. Only rate limits or partial-failure semantics are left unstated.
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 safety-critical side effect is front-loaded in the first sentence, which is exactly right. The second paragraph is dense with parentheticals about Mattermost/Rocket.Chat and proxy hosts, but each clause carries real operational information, so nothing is wasted — only mildly over-packed.
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?
For a two-parameter mutation tool with no output schema, the description covers consent, credential sourcing, payload-shape inference, and the failure mode. Nothing an agent needs to call this correctly is missing, and return-format detail is unnecessary since there is no output 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 coverage is 100%, so the baseline is 3, but the description adds the non-obvious semantic that the webhook endpoint is not a parameter at all and comes from an environment variable, plus the rationale for `kind` being optional. That is genuine meaning beyond the schema text.
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?
States a specific verb and resource ('Posts a finished standup note to a chat webhook') and implicitly contrasts with sibling get_standup_data by telling the agent to send the written note rather than its raw JSON. An agent can tell this is the outbound/send step of the workflow without opening the schema.
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?
Gives an explicit permission gate ('only call it on a note the user has agreed to send') and an explicit conditional for the one optional parameter ('pass it only when the host is not recognisable'). The when-to-use and when-not-to-use conditions are both stated rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.1- Changed
get_note_instructions1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
1 tool update
v0.4.3- Changed
post_standup_note2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Which payload shape to send: slack posts {\"text\"}, discord posts {\"content\"}. Omit it — the shape is inferred from the webhook host. Pass it only when the host is not recognisable, e.g. a proxy in front of the real webhook."New value: +"Which payload shape to send: slack and google-chat post {\"text\"}, discord posts {\"content\"}. Omit it — the shape is inferred from the webhook host. Pass it only when the host is not recognisable, e.g. a proxy in front of the real webhook." - changed
Input schema / properties / kind / enumPrevious value: -[ - "slack", - "discord" -]New value: +[ + "slack", + "discord", + "google-chat" +]
2 tool updates
v0.4.2- Added
get_note_instructions - Added
post_standup_note
1 tool update
v0.4.1- Changed
get_standup_data3 fields changed- changed
Input schema / properties / host / descriptionPrevious value: -"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."New value: +"Self-hosted host, without a scheme, e.g. gitlab.example.com or github.example.com. Required for GitLab, which has no default host; optional for GitHub, which defaults to github.com. A recognisable host also settles `provider` on its own, so the two are rarely both needed." - changed
Input schema / properties / lang / descriptionPrevious value: -"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."New value: +"Language for the date labels inside the returned JSON: en (default) or tr. It relabels dates and nothing else — no field is translated, and the standup note itself is written by the caller, in whatever language they are speaking." - changed
Input schema / properties / provider / descriptionPrevious value: -"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."New value: +"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. Pass it when both are configured — ambiguity fails the call rather than being guessed at."
1 tool update
v0.1.1- Changed
get_standup_data3 fields changed- added
Input schema / properties / hostAdded value: +{ + "description": "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.", + "type": "string" +} - added
Input schema / properties / langAdded value: +{ + "description": "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.", + "enum": [ + "en", + "tr" + ], + "type": "string" +} - added
Input schema / properties / providerAdded value: +{ + "description": "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.", + "enum": [ + "github", + "gitlab" + ], + "type": "string" +}
1 tool update
v0.1.0- First observed
get_standup_data
TDQS
Scored across 3 tools
The three tools form a clear pipeline: fetch data, fetch writing rules, then post the note. Each has a distinct purpose and no two could reasonably be confused (read vs write, data vs rules vs delivery).
All three follow a consistent verb_noun pattern (get_standup_data, post_standup_note, get_note_instructions) in snake_case, with no deviations.
Three tools map exactly onto the workflow's essential steps—fetch snapshot, fetch playbook, post note—with nothing redundant or missing.
The surface covers the full standup workflow end to end. Minor gaps are inherent to the stated scope (read-only snapshot, no MR search/filter), which is documented rather than an oversight.
Maintenance
Related MCP Connectors
Ask what your team decided in meetings, get your standup, and update Jira/Linear-synced tasks.
Generate changelogs, release emails, help-center articles, banners, and social posts from commits.
Context for coding agents: checks a GitHub or Linear issue is ready before your agent starts it.
Opinionated sprint tracker. Read/update tickets, sprints, velocity from Claude/Cursor/Zed.
Related MCP Servers
- AlicenseAqualityCmaintenanceSemantic git queries via MCP. Beyond git log — answer who/what/why about any line, file, or branch with blame, co-change, PR linkage.68 npm2MIT
- 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
- AlicenseAqualityDmaintenanceGenerates daily standup drafts from your actual GitHub, Jira, Linear, and Slack activity, grouping work items and detecting blockers.524 npmMIT