forgejo-mcp/demos/README.md
Christoph Görn a41115b9bb
feat: ✨ add 14 MCP tools for Forgejo releases and release attachments
Implements openspec change add-releases-support (forgejo-mcp-0ep).

- operation/release/: 8 release tools (list/get/create/edit/delete,
  state filter, by-tag variants) + 6 attachment tools (list/get/
  download/create/edit/delete), wired in operation.go + cmd/cli.go
- State filter (all|draft|prerelease|published) applied client-side;
  list_release_attachments sliced client-side (no SDK pagination)
- download_release_attachment reuses MaxInlineDownloadBytes cap and
  BlobResourceContents inline shape from the issue/comment domains
- 19 unit tests covering pagination, state guard, partial-edit PATCH,
  base64 decode guard, client-side slice boundaries, over/at-cap download
- params: ReleaseID/Tag/TagName/TargetCommitish/Draft/Prerelease/State
- README tools table + DEVELOPER.md domain list updated
- demos/release-management.md: read-only walkthrough with real
  Codeberg output; write-tool surface; autonomous release-notes workflow
2026-05-12 16:45:53 +02:00

190 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# forgejo-mcp Demos
End-to-end, copy-pasteable walkthroughs for the MCP tools shipped by
`forgejo-mcp`. Each demo is a single Markdown file containing real
`./forgejo-mcp --cli` invocations against `codeberg.org` together with
the output they produced — the same payload an MCP client would see.
## How to read a demo
Every demo follows the same shape:
1. **Background / What these tools do** — the user-facing problem the
feature solves and the tool surface it adds.
2. **Setup** — environment variables and the `make build` line. Identical
across demos; once your shell is set up, skip it on subsequent reads.
3. **Walkthrough** — numbered, runnable shell blocks paired with the
exact output produced. Where helpful, a Python one-liner formats the
raw JSON envelope down to the fields that matter.
4. **End-to-end / Autonomous workflow** — how an agent strings the
primitives together into a useful task (triage, review, time-track,
etc.).
Demos use the CLI front-end (`--cli <tool> --args '<json>'`) because it
is the same code path as MCP `tools/call` but plays well with shell
pipelines. Everything shown also works over stdio MCP and the streamable
HTTP transport.
## Setup once, run anywhere
```bash
export FORGEJO_URL=https://codeberg.org
export FORGEJO_ACCESS_TOKEN=<your-token>
make build
```
After that, every command in every demo starts with `./forgejo-mcp --cli`.
---
## Demos by topic
### 1. Issues, labels, milestones
Discovery and write tools for the core issue-tracking primitives.
Autonomous agents need to map names → numeric IDs before they can call
the mutating tools; the discovery demos cover that, the label demos
cover the mutations.
| Demo | Tools | What it shows |
|------|-------|---------------|
| [list-milestones-labels.md](list-milestones-labels.md) | `list_repo_labels`, `list_repo_milestones` | Discover the ID↔name mapping needed by `add_issue_labels` and `update_issue` |
| [issue-labels.md](issue-labels.md) | `add_issue_labels`, `remove_issue_labels` | Full add/remove cycle on a real issue, plus multi-label calls |
| [org-labels.md](org-labels.md) | `list_org_labels`, merged `list_repo_labels` | Org-scope labels surfaced through the same ID space, with `scope` field and opt-out |
**Use case.** Build a label lookup table once, then have the agent
classify issues and apply labels without ever leaving the MCP loop.
### 2. Attachments
Forgejo lets users drop files on issues and on individual comments.
These demos cover the full CRUD shape — list, get, download, create,
edit, delete — for both surfaces.
| Demo | Tools | What it shows |
|------|-------|---------------|
| [issue-attachments.md](issue-attachments.md) | 6 tools keyed by `index` | Upload, inspect, download, rename, delete attachments on an issue/PR |
| [comment-attachments.md](comment-attachments.md) | 6 tools keyed by `comment_id` | Same lifecycle on individual comment attachments |
**Use case.** An agent triaging a bug report needs to fetch the
attached log file before reasoning about it; an agent writing a release
note needs to attach a generated changelog to the release comment.
### 3. Releases
Tag-anchored release records and their binary assets. CRUD on releases (with a client-side `state` filter and `target_commitish` for new tags) plus the full attachment lifecycle on each release.
| Demo | Tools | What it shows |
|------|-------|---------------|
| [release-management.md](release-management.md) | 14 tools — 8 release + 6 release-attachment | Read flow against `goern/forgejo-mcp` (list/latest/by-tag/state filter/list assets/over-cap download) plus the parameter surface for the write tools and the autonomous "draft notes for the next tag" workflow |
**Use case.** A release-housekeeping agent that reads `get_latest_release`, summarises the commit log since `published_at` into Markdown notes, drafts the next release with `create_release`, optionally uploads built binaries with `create_release_attachment`, and waits for a human to flip `draft=false` via `edit_release`.
### 4. Time tracking
Forgejo carries a per-issue tracked-time ledger and a live stopwatch.
Two demos split read/write of the ledger from the stopwatch transitions,
because they are different mental models.
| Demo | Tools | What it shows |
|------|-------|---------------|
| [issue-time-tracking.md](issue-time-tracking.md) | 6 tools — list, add, delete, reset, user/repo aggregates | Manage the tracked-time ledger directly |
| [issue-stopwatch.md](issue-stopwatch.md) | 4 tools — start, stop, cancel, list mine | Drive the live stopwatch so the server computes the elapsed time |
**Use case.** Agents that run long-lived tasks can record the time
they actually spent without having to compute deltas themselves —
start the stopwatch when work begins, stop it when work ends, let
Forgejo do the math.
### 5. Notifications
Two demos: the lightweight "what's new" check, and the full
notification-management API for marking read, fetching threads, and
clearing inboxes.
| Demo | Tools | What it shows |
|------|-------|---------------|
| [check-notifications.md](check-notifications.md) | `check_notifications` | Read-only inbox poll across all watched repos |
| [notifications-management.md](notifications-management.md) | list/get/mark-read tools | 100% notification API coverage — per-thread and bulk |
**Use case.** A daily-standup agent that opens with "since yesterday,
N notifications across M repos" and can clear them as it processes
each one.
### 6. Organization management
| Demo | Tools | What it shows |
|------|-------|---------------|
| [org-management.md](org-management.md) | 15 tools in the `org` domain | CRUD on the org itself, membership, and teams |
**Use case.** Provisioning workflows — spin up a new org, add the
team, attach repos, all from a single agent transcript with no
web-UI clicks.
### 7. Code review (bounded I/O)
| Demo | Tools | What it shows |
|------|-------|---------------|
| [bounded-responses.md](bounded-responses.md) | `get_pull_request_diff` with `file_path`, `get_file_content` with `start_line`/`end_line` | Cut payloads to just the file or line range the agent needs (measured 16× / 41× reductions on real data) |
**Use case.** Reviewing a PR no longer means pulling the whole diff
into the model's context. Pick one file's hunks, optionally read a
few lines of surrounding source around each hunk, repeat. Per-call
payloads stay proportional to what the agent actually inspects.
This is the user-facing half of the architectural rule in
[`../docs/design/output-bounding.md`](../docs/design/output-bounding.md):
every data-proportional response in this server must be bounded by
the caller. Expect future tools to follow the same pattern.
### 8. Transport / infrastructure
| Demo | Feature | What it shows |
|------|---------|---------------|
| [streamable-http-transport.md](streamable-http-transport.md) | `--transport http` | Run forgejo-mcp as a remote MCP server compatible with Claude.ai's custom-connector flow |
**Use case.** Hosting a single forgejo-mcp instance behind an HTTPS
endpoint and pointing multiple MCP clients at it, instead of every
client spawning its own stdio subprocess.
---
## Cross-cutting workflows
The demos individually cover single tool families. The interesting
agent workflows compose across them:
- **Autonomous issue triage.** §1 (discover labels) → read issue
body → §2 (fetch attachments if any) → §1 (apply labels) →
§4 (start stopwatch if the agent will keep working on it).
- **Code review.** §7 (per-file diff slices + per-range file reads)
→ review-write tools (covered in the top-level README, not yet in a
dedicated demo) → merge.
- **Release housekeeping.** §3 (draft notes via `get_latest_release` +
commit log, then `create_release` with `draft=true`) → §5 (process
notifications on the new release) → §6 (rotate team membership if
needed).
## Conventions
- **`scope` field on labels.** Returned by `list_repo_labels` and
`list_org_labels`. `"repo"` or `"org"`. Both can be passed to
`add_issue_labels` without distinction.
- **`index` vs `comment_id`.** Issue/PR-level tools take `index`
(the per-repo issue number). Comment-level tools take `comment_id`
(the global comment ID returned by `list_issue_comments`).
- **JSON envelope.** CLI responses are an array of MCP `Content`
blocks, e.g. `[{"type":"text","text":"..."}]`. Plain-text tools
wrap the payload in a second `{"Result":...}` layer; the demo
scripts unwrap both.
- **Showboat stamps.** The `<!-- showboat-id: ... -->` comment at
the top of each demo lets the Showboat tool detect and refresh
the file in place when the feature evolves.
## Adding a new demo
When a new feature ships, add a demo file under `demos/` and register
it in the right section of this README. Keep the existing shape:
background → setup → numbered walkthrough with output blocks →
end-to-end workflow. Use real data from `codeberg.org` where possible
so the numbers (sizes, counts, IDs) stay honest.