gittr-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BRIDGE_URL | No | Base URL of the gittr bridge (e.g., https://gittr.space) | |
| GITTR_LNBITS_URL | No | Optional LNbits URL for Lightning functionality | |
| GITTR_LNBITS_ADMIN_KEY | No | Optional LNbits admin key |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| listReposB | Discover repositories from Nostr relays (NIP-34). Filter by pubkey or search term. |
| getRepoA | Get a single repository by ID or owner+name |
| resolveRepoByNostrIdA | Resolve repo by Nostr identity (npub or hex) and repo name. Returns cloneUrl (prefer git.gittr.space), cloneUrls, relays for location-agnostic use. |
| searchReposB | Full-text search across repository names and descriptions |
| findReposBySourceA | Exact reverse lookup: given one or more forge URLs (GitHub, GitLab, Codeberg, Gitea, …) or github owner/repo shorthand, find Nostr kind-30617 announces with that source/forkedFrom. Returns npub + gittr URL so you can DM owners when the forge is unreachable. Does NOT fuzzy-match renamed slugs. |
| findReposByGithubB | Alias for findReposBySource (exact forge URL → npub). Prefer findReposBySource for non-GitHub forges. |
| myReposA | List repositories owned by the current user (from .nostr-keys.json) |
| pushToBridgeA | Push files to the git server (REQUIRES signing with privkey). This replaces the branch with one new snapshot commit. It does not keep imported GitHub history. Optional deletedPaths removes files or whole folders on that snapshot (same as gittr UI folder delete); allowTreeShrink defaults true when deletes are present. |
| publishRepoAnnouncementB | Publish repository to Nostr (kind 30617). Always writes the same clone addresses as the website Push (gittr, ngit, gitnostr, shakespeare, danconway). A GitHub URL is kept as the source, not as a clone. The private key is loaded from .nostr-keys.json when omitted. |
| publishRepoStateB | Publish repository state to Nostr (kind 30618). HEAD follows branch when passed, otherwise main or master, not the alphabetically first branch. The private key is loaded from .nostr-keys.json when omitted. |
| createRepoA | CREATE A REPO IN ONE CALL - Push files AND publish to Nostr. Best for agents! Auto-loads credentials from .nostr-keys.json. |
| describeAgentAuthA | Show whether Nostr keys are loaded (hex/npub only — never returns private key). Use first in a session. |
| setupTestKeypairA | Create a disposable TEST Nostr keypair and write .nostr-keys.json so all tools auto-load it. ASK THE USER FIRST — a keypair is a permanent Nostr identity. Without confirm:true this only returns the question to ask. Never overwrites real credentials unless force:true. |
| forkRepoC | Fork an existing repository |
| mirrorRepoA | Same result as the website Push of a GitHub/GitLab repo. Copies the forge commits onto gittr (keeps history, updates an existing repo), announces the same git servers as the website, and publishes the branch tips with HEAD on the forge default branch. A second call keeps the existing name, description, and web links unless you pass new ones. Do not follow this with pushToBridge. If the forge returns 403 (account suspended or blocked), do not call this again and do not pass a different URL to change the source: this copies that URL onto the gittr bare repo and replaces every branch. Read the existing copy with bridgeListFiles after git ls-remote on https://git.gittr.space//.git. A new forge URL is not a way to leave a dead host: the owner uses the website sidebar If this git host is gone. See docs/AGENT-WORKFLOW.md. |
| listBountiesC | Discover open bounties (issues with bounty labels or Lightning funding) |
| getFileA | Get file content without a full local clone. Tries gittr bridge file-content, then a few hardcoded GRASP /raw/ hosts. Not full Code-tab parity (no 30617 clone[] / repo-files for home remotes) — prefer bridgeListFiles after importRemoteToBridge/mirrorRepo. |
| addCollaboratorB | Add maintainer on kind 30617 (republishes full announcement with updated maintainers tag — matches gittr UI) |
| listIssuesB | List issues the way the website Issues tab does. Nostr issues, plus GitHub or Codeberg/Gitea issues when the repo source says so. A forge issue and a Nostr issue stay separate rows. GitLab sources stay Nostr-only, same as the website. |
| createIssueA | Create an issue - REQUIRES signing |
| listIssueCommentsA | Comments on an issue, same as the website. A 64-character Nostr id returns Nostr comments. issue-N or a number needs ownerPubkey and repoId and returns the forge comments. Nothing is posted back to GitHub. |
| createIssueCommentA | Publish a NIP-22 comment (kind 1111) on an issue. Optional replyTo for threaded replies. Does not create/modify bounty (9806) events. |
| listPRCommentsA | Comments on a pull request, same as the website. A 64-character Nostr id returns Nostr comments. pr-N or a number needs ownerPubkey and repoId and returns the forge conversation. Nothing is posted back to GitHub. |
| createPRCommentB | Publish a NIP-22 comment (kind 1111) on a pull request. Optional replyTo for threaded replies. |
| listPRsB | List pull requests the way the website does. Nostr pull requests, plus GitHub or Codeberg/Gitea pull requests when the repo source says so. They stay separate rows. |
| createPRC | Create a pull request - REQUIRES signing |
| createPRViaGittrCLIA | Create PR via gittr CLI - full flow including git push (RECOMMENDED for PRs) |
| getPublicKeyC | Get public key from private key |
| loadCredentialsA | Load Nostr credentials from .nostr-keys.json (for debugging) |
| submitBountyB | Submit work on a bounty (claim it with PR/evidence) |
| starRepoA | Star a repo (NIP-25 kind 7 on the latest kind 30617 event: tags e+k+p, content +). Requires a published repo announcement on relays. |
| unstarRepoA | Unstar a repo (NIP-25 kind 7 on the 30617 event with content "-"). Same tags as starRepo. |
| listStarsA | List repos a user starred (kind 7 with #k 30617 and #e pointing at 30617 events; latest reaction per repo wins) |
| watchRepoA | Watch a repo (NIP-51 kind 10018 followed-repos list — publishes full |
| unwatchRepoB | Unwatch a repo (republish kind 10018 without this repo) |
| listWatchedReposA | List repos from your latest kind 10018 followed-repos event on relays |
| getTrendingReposC | Get trending/popular repositories |
| getRepoContributorsB | Get contributors to a repository |
| getBranchesC | Get branches for a repository |
| getCommitHistoryC | Get commit history for a repository |
| createReleaseD | Not supported for UI release notes. For Zapstore/NIP-82 announce use announceSoftwareFromForgeRelease. For git tags use listReleases + publishRepoState. |
| listReleasesA | List git tags from the bridge (refs/tags/*), not Zapstore software releases and not the website Releases tab |
| fetchForgeReleasesA | Fetch a public forge Release (GitHub/Codeberg/GitLab) with announceable binaries (APK, AppImage, DMG, linux tar.gz, MSI/EXE, IPA). Omit tag for latest. Set hash:true to compute sha256 (slow; required before announce). |
| listForgeReleasesA | List all forge Releases + assets for a source URL (same as gittr Releases tab). No NIP-82 MIME gate. Distinct from listReleases (git tags). |
| announceSoftwareFromForgeReleaseA | Announce software to Zapstore/NIP-82 (kinds 32267/30063/3063) from a forge Release binary. Same as gittr Nostr Apps (latest tag) or Releases → Announce on Nostr (tag=). Never a tagless app. Copies images: from the forge zapstore.yaml onto kind 32267. Optional pinToBlossom uses public Blossom; blossom.gittr.space only for the official gittr APK (space.gittr.app). Auto-loads .nostr-keys.json if privkey omitted. |
| deleteSoftwareAnnounceA | NIP-09 kind 5 deletion for previously published NIP-82 app/release/asset event ids (does not delete the git repo). |
| softDeleteRepoA | Owner soft-delete for a NIP-34 repo: publish replaceable 30617 with deleted markers + NIP-09 kind 5, and POST the signed 30617 to the bridge /api/nostr/repo/event (same as gittr Settings → Delete). Alias: deleteRepo. |
| deleteRepoC | Alias for softDeleteRepo — soft-delete a NIP-34 repository (owner only). |
| publishSoftwareAnnounceB | Low-level: publish NIP-82 events from an already-fetched forge payload (ok:true + hashed announceable binary). Prefer announceSoftwareFromForgeRelease. |
| publishNostrPagesA | Publish Nostr Pages (NIP-5A kind 35128): upload static files through gittr’s Blossom proxy (kind 24242), then sign the named-site manifest. Requires index.html. Pass files or fromBridge:true to read the git tree. Default Blossom is blossom.gittr.space (Pages only — never for app installers). |
| auditRepoDependenciesA | Scan a gittr bridge repo’s manifests (package.json, yarn.lock, go.mod, …) and query OSV via POST /api/security/audit. Same data as the gittr Dependencies tab. Does not require the website audit UI flag. |
| exploreReposC | Explore repositories by category/topic |
| updatePullRequestB | Publish NIP-34 PR update (kind 1619): new tip commit + clone URLs |
| publishStatusForRootB | Publish NIP-34 status (1630 open, 1631 merged/applied, 1632 closed, 1633 draft) for an issue, PR, or patch root event |
| createBountyInvoiceA | Create Lightning invoice for bounty escrow (POST /api/bounty/create). Use GITTR_LNBITS_* env or pass lnbitsUrl + lnbitsAdminKey. Publish kind 9806 after pay via publishBountyToNostr. |
| publishBountyToNostrC | Publish gittr bounty metadata event (kind 9806) |
| listBountiesForIssueA | List kind 9806 bounty events linked to an issue id |
| getIssueByIdA | One issue, the way the website opens it. A 64-character id is the Nostr issue. issue-N or a number needs ownerPubkey and repoId and reads the forge issue. |
| getPullRequestByIdB | One pull request, the way the website opens it. A 64-character id is the Nostr pull request. pr-N or a number needs ownerPubkey and repoId and reads the forge pull request. |
| closeIssueC | Convenience: publish status 1632 (closed) for an issue |
| reopenIssueC | Convenience: publish status 1630 (open) for an issue |
| markPullRequestMergedC | Convenience: publish status 1631 (merged/applied) for a PR root event |
| mergePullRequestA | Full merge: git clone/fetch with signed HTTPS auth, merge PR head, push to bridge, optional 30618+1631. Signer must be repo owner OR on latest kind 30617 merge_maintainers (if that tag exists) OR on maintainers when merge_maintainers is absent. Requires git on PATH. repoId optional if derivable from PR a-tag. |
| importRemoteToBridgeB | Copy a Git URL onto the bridge. With the owner key, an existing forge repo is updated to the forge commits (history kept). Does not publish the Nostr card — use mirrorRepo for the same result as the website Push. Do not use pushToBridge to sync a forge. If the URL returns 403, do not retry it and do not pass a different URL to change source: this force-updates the gittr branches to match the URL. Read the existing bare repo with bridgeListFiles instead. Leaving a dead forge is the website sidebar If this git host is gone, not this tool. |
| bridgeRepoExistsC | GET /api/nostr/repo/exists — check if repo exists on bridge |
| bridgeListFilesC | GET /api/nostr/repo/files — list files for branch |
| bridgeGetFileContentC | GET /api/nostr/repo/file-content — raw file from bridge |
| bridgeListRefsD | GET /api/nostr/repo/refs |
| bridgeListCommitsD | GET /api/nostr/repo/commits |
| getPushPaywallStatusC | GET /api/nostr/repo/push-payment — push cost and whether payer has paid intent |
| createPushPaywallIntentC | POST push-payment action create_intent — invoice for pay-to-push (owner wallet keys in body) |
| syncRepoPushPolicyB | POST /api/nostr/repo/push-policy-sync — upsert push paywall from signed kind 30617 (use announcement event JSON from publishRepoAnnouncement) |
| bountyReleaseC | POST /api/bounty/release — pay bounty to recipient Lightning address |
| bountyCreateWithdrawC | POST /api/bounty/create-withdraw — LNURL-withdraw for bounty flow |
| bountyClaimWithdrawD | POST /api/bounty/claim-withdraw — claim withdraw to recipient |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 75 tools
Multiple tools overlap heavily: createPR vs createPRViaGittrCLI, listReleases vs listForgeReleases vs fetchForgeReleases, publishSoftwareAnnounce vs announceSoftwareFromForgeRelease, and pushToBridge vs importRemoteToBridge vs mirrorRepo. Several aliases (deleteRepo/findReposByGithub) and multiple bounty flows add to the confusion. An agent must read long warnings to choose correctly.
All tool names use lowerCamelCase consistently, so there is no casing chaos. However, the verb+noun pattern is not uniform: some tools are noun-first (bountyCreateWithdraw, bountyRelease), and verb choices vary widely (fetch, announce, explore, star, watch, merge, softDelete). Aliases and prefixed names (bridge*) are minor deviations.
75 tools is far beyond the typical 3-15 range and includes many alias, low-level, and niche tools. While the platform is broad, the count forces agents to sift through redundant options and raises the risk of misselection. It should be consolidated.
Core lifecycle coverage is strong: repos (create/get/list/delete/fork), issues (create/list/get/close/reopen/comments), PRs (create/list/get/merge/comments), bounties, releases, paywall, and bridge operations are all present. Minor gaps exist (e.g., no updateIssue, no removeCollaborator, createRelease is a stub), but agents can work around them.