standup-mr 0.3.3 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/README.md +1 -0
- package/dist/mcp/server.js +28 -7
- package/llms-install.md +79 -0
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,42 @@ All notable changes to standup-mr are recorded here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[semantic versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.4.1] - 2026-09-02
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- `get_standup_data` documents itself properly. The description now gives the
|
|
12
|
+
shape of the object it returns, says the tool is a snapshot rather than a
|
|
13
|
+
search API and what that rules out, and spells out failure behaviour: a
|
|
14
|
+
rejected token, a refused resource or a rate limit surfaces the host's own
|
|
15
|
+
message after two retries on transient errors, and a blocker whose
|
|
16
|
+
diagnosis could not be fetched still comes back with `job: "unknown"`. The
|
|
17
|
+
parameter descriptions gained the interactions the schema cannot express —
|
|
18
|
+
`host` is required for GitLab and optional for GitHub, a recognisable host
|
|
19
|
+
settles `provider` on its own, and `lang` relabels dates without
|
|
20
|
+
translating anything.
|
|
21
|
+
|
|
22
|
+
## [0.4.0] - 2026-09-01
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **The MCP tool takes arguments.** `get_standup_data` exposed an empty input
|
|
27
|
+
schema, so an MCP client could not pick a provider, point at a self-hosted
|
|
28
|
+
host, or ask for Turkish date labels — all of which the CLI has always
|
|
29
|
+
allowed. `provider` (`github` / `gitlab`), `host` and `lang` (`en` / `tr`)
|
|
30
|
+
are now declared options, each with a description. The two enums replace
|
|
31
|
+
free strings, so an unsupported language is rejected instead of silently
|
|
32
|
+
falling back to English.
|
|
33
|
+
|
|
34
|
+
No token argument, deliberately: credentials come from the environment or a
|
|
35
|
+
logged-in `gh` / `glab` session, and a tool argument would end up in the
|
|
36
|
+
transcript.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- `zod` is a direct dependency rather than one borrowed from the MCP SDK's
|
|
41
|
+
dependency tree.
|
|
42
|
+
|
|
7
43
|
## [0.3.3] - 2026-09-01
|
|
8
44
|
|
|
9
45
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# standup-mr
|
|
2
2
|
|
|
3
3
|
[](https://glama.ai/mcp/servers/Jubstaaa/standup-mr)
|
|
4
|
+
[](https://mcpservers.org/servers/jubstaaa/standup-mr)
|
|
4
5
|
|
|
5
6
|
Standup notes from **merge request state**, not commit logs.
|
|
6
7
|
|
package/dist/mcp/server.js
CHANGED
|
@@ -5,6 +5,7 @@ import { realpathSync } from "fs";
|
|
|
5
5
|
import { pathToFileURL } from "url";
|
|
6
6
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
7
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
import { z } from "zod";
|
|
8
9
|
|
|
9
10
|
// src/manifest/manifest.ts
|
|
10
11
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -1043,16 +1044,33 @@ async function collect(options = {}) {
|
|
|
1043
1044
|
const provider = options.providerImpl ?? connect({ provider: options.provider, host: options.host, token: options.token });
|
|
1044
1045
|
return buildReport(provider, /* @__PURE__ */ new Date(), options.lang ?? "en");
|
|
1045
1046
|
}
|
|
1047
|
+
var STANDUP_TOOL_DESCRIPTION = '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.\n\nCall 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.\n\nRead-only, and credentials never come from an argument \u2014 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.';
|
|
1048
|
+
var STANDUP_TOOL_SCHEMA = {
|
|
1049
|
+
provider: z.enum(["github", "gitlab"]).optional().describe(
|
|
1050
|
+
"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 \u2014 ambiguity fails the call rather than being guessed at."
|
|
1051
|
+
),
|
|
1052
|
+
host: z.string().optional().describe(
|
|
1053
|
+
"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."
|
|
1054
|
+
),
|
|
1055
|
+
lang: z.enum(["en", "tr"]).optional().describe(
|
|
1056
|
+
"Language for the date labels inside the returned JSON: en (default) or tr. It relabels dates and nothing else \u2014 no field is translated, and the standup note itself is written by the caller, in whatever language they are speaking."
|
|
1057
|
+
)
|
|
1058
|
+
};
|
|
1059
|
+
async function runStandupTool(args, collector = collect) {
|
|
1060
|
+
const report = await collector({
|
|
1061
|
+
provider: args.provider,
|
|
1062
|
+
host: args.host,
|
|
1063
|
+
lang: args.lang
|
|
1064
|
+
});
|
|
1065
|
+
return { content: [{ type: "text", text: JSON.stringify(report) }] };
|
|
1066
|
+
}
|
|
1046
1067
|
async function main() {
|
|
1047
1068
|
const server = new McpServer({ name: "standup-mr", version: packageVersion(import.meta.url) });
|
|
1048
1069
|
server.tool(
|
|
1049
1070
|
"get_standup_data",
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
async () =>
|
|
1053
|
-
const report = await collect();
|
|
1054
|
-
return { content: [{ type: "text", text: JSON.stringify(report) }] };
|
|
1055
|
-
}
|
|
1071
|
+
STANDUP_TOOL_DESCRIPTION,
|
|
1072
|
+
STANDUP_TOOL_SCHEMA,
|
|
1073
|
+
async (args) => await runStandupTool(args)
|
|
1056
1074
|
);
|
|
1057
1075
|
await server.connect(new StdioServerTransport());
|
|
1058
1076
|
}
|
|
@@ -1071,6 +1089,9 @@ if (entryUrl && import.meta.url === entryUrl) {
|
|
|
1071
1089
|
});
|
|
1072
1090
|
}
|
|
1073
1091
|
export {
|
|
1092
|
+
STANDUP_TOOL_DESCRIPTION,
|
|
1093
|
+
STANDUP_TOOL_SCHEMA,
|
|
1074
1094
|
collect,
|
|
1075
|
-
main
|
|
1095
|
+
main,
|
|
1096
|
+
runStandupTool
|
|
1076
1097
|
};
|
package/llms-install.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Installing standup-mr
|
|
2
|
+
|
|
3
|
+
Instructions for an AI assistant setting this MCP server up on a user's
|
|
4
|
+
machine. Everything here is verified against the published package.
|
|
5
|
+
|
|
6
|
+
## What it needs
|
|
7
|
+
|
|
8
|
+
- Node.js 20 or newer. Nothing to clone, nothing to build — the server runs
|
|
9
|
+
straight from npm.
|
|
10
|
+
- Read access to the user's GitLab or GitHub. It never takes a credential as
|
|
11
|
+
a tool argument; credentials come from the environment or from a logged-in
|
|
12
|
+
`gh` / `glab` session.
|
|
13
|
+
|
|
14
|
+
## Config
|
|
15
|
+
|
|
16
|
+
Add this to the MCP settings file (for Cline,
|
|
17
|
+
`cline_mcp_settings.json`):
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"standup": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "standup-mr", "mcp"],
|
|
25
|
+
"env": {}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That is the whole install when the user already has `gh` or `glab` logged in
|
|
32
|
+
— leave `env` empty and the server picks the session up.
|
|
33
|
+
|
|
34
|
+
## Credentials, when there is no CLI session
|
|
35
|
+
|
|
36
|
+
Add only the pair the user actually needs.
|
|
37
|
+
|
|
38
|
+
| Variable | When |
|
|
39
|
+
|---|---|
|
|
40
|
+
| `GITHUB_TOKEN` | GitHub, no `gh` session |
|
|
41
|
+
| `GITHUB_HOST` | GitHub Enterprise only; defaults to `github.com` |
|
|
42
|
+
| `GITLAB_TOKEN` | GitLab, no `glab` session |
|
|
43
|
+
| `GITLAB_HOST` | **Required for GitLab** — there is no default host |
|
|
44
|
+
| `STANDUP_PROVIDER` | `github` or `gitlab`, when both are configured and the choice is ambiguous |
|
|
45
|
+
|
|
46
|
+
Ask the user for a token; do not invent one, and do not put a token anywhere
|
|
47
|
+
but `env`.
|
|
48
|
+
|
|
49
|
+
## The one tool
|
|
50
|
+
|
|
51
|
+
`get_standup_data` returns the previous working day's activity, open merge
|
|
52
|
+
requests bucketed by state (ready / blocked / draft / stale), pending
|
|
53
|
+
reviews, and the error lines from any failed pipeline job. All three
|
|
54
|
+
arguments are optional:
|
|
55
|
+
|
|
56
|
+
- `provider` — `github` or `gitlab`; omit to auto-detect
|
|
57
|
+
- `host` — self-hosted host, no scheme
|
|
58
|
+
- `lang` — `en` or `tr`; changes date labels in the JSON only
|
|
59
|
+
|
|
60
|
+
## Verifying the install
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npx -y standup-mr mcp
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
It speaks MCP over stdio and writes nothing else to stdout. A successful
|
|
67
|
+
`initialize` reports `{"name":"standup-mr","version":"<current>"}`.
|
|
68
|
+
|
|
69
|
+
If the user is not on an MCP client, `npx standup-mr fetch --markdown`
|
|
70
|
+
prints the same data as a digest.
|
|
71
|
+
|
|
72
|
+
## Writing the note
|
|
73
|
+
|
|
74
|
+
The tool returns data, not prose. The note-writing rules live in the bundled
|
|
75
|
+
skill; pour them into whatever instructions file the assistant reads:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx standup-mr instructions >> AGENTS.md
|
|
79
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "standup-mr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"mcpName": "io.github.Jubstaaa/standup-mr",
|
|
5
5
|
"description": "Standup notes from merge request state, not commit logs.",
|
|
6
6
|
"keywords": [
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
],
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"author": {
|
|
17
|
-
"name": "
|
|
17
|
+
"name": "İlker Balcılar",
|
|
18
18
|
"email": "ilkerbalcilartr@gmail.com"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"dist",
|
|
49
49
|
"skills",
|
|
50
50
|
"mcp/README.md",
|
|
51
|
+
"llms-install.md",
|
|
51
52
|
"README.md",
|
|
52
53
|
"CHANGELOG.md",
|
|
53
54
|
"LICENSE"
|
|
@@ -60,7 +61,8 @@
|
|
|
60
61
|
"prepublishOnly": "tsup"
|
|
61
62
|
},
|
|
62
63
|
"dependencies": {
|
|
63
|
-
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
64
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
65
|
+
"zod": "^4.4.3"
|
|
64
66
|
},
|
|
65
67
|
"devDependencies": {
|
|
66
68
|
"@types/bun": "^1.0.0",
|