gittr-mcp
This MCP server lets an AI agent operate a gittr/Nostr git hosting account: manage repositories, files, issues, PRs, bounties, releases, pages, and identity-backed auth.
Discover, search, list, explore, and trend repositories; resolve repos by Nostr ID or forge source.
Create, fork, mirror, import, and soft-delete repositories; push files and publish NIP-34 repo announcements/state.
Read repo files, branches, commits, refs, and bridge file contents without cloning.
Create/list/comment on/close/reopen issues; create/list/comment on/update/merge pull requests and publish status events.
Manage collaborators, stars, watches, contributors, and pay-to-push policies.
Work with Lightning bounties: list, invoice, publish, submit, release, withdraw, and link to issues.
List git tags, fetch forge releases, announce NIP-82/Zapstore software releases, and delete software announcements.
Publish Nostr Pages and audit repository dependencies via gittr/OSV.
Inspect/setup Nostr keys, describe agent auth, load credentials, and derive public keys.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gittr-mcp Create a new repo named 'ai-tools' and push my code"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
gittr-mcp
Let your AI agent (or app) use gittr — Nostr git hosting — like a developer would — create repos, push code, open and merge pull requests, manage issues, and work with Lightning bounties — using your Nostr identity, not a GitHub login.
Works with Cursor, Claude Desktop, VS Code / Copilot MCP, Windsurf, OpenClaw, or any host that speaks the Model Context Protocol over stdio.
Needs Node 22.23.4, 24.22.1, or 26.12.1 (or a newer build on those lines). Node 18 and 20 have no fix for the October 2026 certificate and Brotli bugs, and gittr-mcp exits instead of starting on those.
Docs hub: gittr-docu — product map and how this MCP sits next to the website.
This repo’s Page: root index.html. After Push Manifest, save site name gittr-mcp.
Why use this?
Without gittr-mcp | With gittr-mcp |
You copy-paste between chat and the gittr website | The agent calls tools: push files, publish repo metadata, open issues/PRs |
Custom scripts for NIP-98 bridge auth and NIP-34 signing | Signing, challenge handling, and relay checks are built in |
Unclear whether a push “really” landed on Nostr | Tools return pass/fail plus |
End result: one MCP server connects your agent to decentralized git on Nostr — same account as on gittr.space (nsec / keys file), no separate vendor account for the agent.
Hosting note: The website Create/Import flow stays browser-local until announce/Push. MCP createRepo / mirrorRepo / pushToBridge write the git the same way the website does. The clone addresses are the servers saved under Settings → Relays (yours first), then the public copies. Soft-delete POSTs the tombstone to the bridge so disk is wiped.
Related MCP server: jt-mcp-server
Where this sits (platform map)
gittr-mcp is the agent door into the same platform humans use in the browser. You are here = gittr-mcp (this repo, teal). Cyan-outlined host boxes = public hostnames (git. / pages. / relay.gittr.space) (teal = this repo; cyan outline = host URLs).
flowchart TB
Agent["AI host<br/>Cursor / Claude / …"]
MCP["★ YOU ARE HERE · gittr-mcp<br/>this repo · agent tools"]
UI["gittr Client<br/>gittr.space"]
Bridge["gitnostr Bridge<br/>git.gittr.space<br/>SSH / HTTPS git"]
RelayGittr["gittr Pyramid relay<br/>relay.gittr.space<br/>wss · open forge + GRASP"]
Relays["Other Nostr relays"]
Pages["Pages / nsite<br/>pages.gittr.space"]
Remote["git remote nostr<br/>optional"]
Agent -->|MCP tools| MCP
MCP -->|HTTPS + Nostr auth| Bridge
MCP -->|sign NIP-34 events| RelayGittr
MCP -->|sign NIP-34 events| Relays
UI --> RelayGittr
UI --> Relays
UI --> Bridge
Pages --> Relays
Remote -.-> Relays
classDef youAreHere fill:#0f766e,stroke:#5eead4,stroke-width:3px,color:#ecfdf5
classDef hostUrl fill:#164e63,stroke:#22d3ee,stroke-width:2px,color:#ecfeff
class MCP youAreHere
class Bridge,Pages,RelayGittr hostUrlPiece | Host / link | How MCP uses it |
gittr Client | gittr on gittr.space · | Same product; MCP mirrors forge actions (repos, issues, PRs, bounties) |
gitnostr Bridge | gitnostr on gittr.space · |
|
Pages / nsite | nsite-gateway · | Out of band for most MCP git tools |
Blossom | gittr-blossom · | Blob storage Pages uploads land on |
gittr Pyramid relay | pyramid · | Prefer in relay lists when publishing NIP-34 |
★ gittr-mcp (this README) | You are here | |
git remote nostr | Not required for MCP; agents usually use bridge HTTPS + events |
Addressing for agents: resolveRepoByNostrId(npub|hex, repo) → cloneUrl + relays. Prefer announced npub-path HTTPS on git.gittr.space (NIP-34); hex path is a disk fallback if a symlink is missing. Include wss://relay.gittr.space when publishing.
What you can do (workflows)
These are the processes people actually run; each maps to MCP tools the agent can call. Agents: follow docs/AGENT-WORKFLOW.md (which tool, and what not to call after it).
Ship a new project
createRepo— push initial files to the bridge and publish Nostr kinds 30617 + 30618 in one step (best default for agents).
PasspublicRead: falseto create a private repo (code/clone/API/SSH readable only by you and listed maintainers). The announcement name/description still appear on relays — only file access is gated.Or step-by-step:
pushToBridge→publishRepoAnnouncement→publishRepoState.
Private repositories
Set
publicRead: falseoncreateRepo,publishRepoAnnouncement,forkRepo, ormirrorRepo.Private repos are hidden from Explore/home/profile listings for strangers.
Direct URL still shows the repo name with a Private badge; unauthorized viewers see a lock screen (no code).
SSH / CLI / API reads use the same ACL as the web UI: your npub must be owner or maintainer (
addCollaboratoror Settings → Contributors on gittr.space).SSH key registration is unchanged — keys identify you; private repos only check whether your pubkey has read permission.
Day-to-day development
pushToBridge— update files on a branch (NIP-98 auth to gittr bridge); optionaldeletedPaths/allowTreeShrinkfor file or folder deletes (parity with Code-tab trash).getFile,bridgeListFiles,bridgeGetFileContent,getBranches,getCommitHistory— read without cloning.getFileis the bridge, then a short GRASP list — not the Code tab. On the website: latest live 30617; forgesourceis the tree when present (stale bridge listing is replaced); otherwise first non-emptyclone[]listing. See MCP-GITTR-PARITY.md and gittr FILE_FETCHING_INSIGHTS.md.resolveRepoByNostrId— find clone URLs and relays from npub + repo name.
Issues (bug reports, tasks)
listIssues,getIssueById— same rows as the website Issues tab. Nostr issues, plus GitHub or Codeberg/Gitea issues when the repo source says so. They stay separate rows.getIssueByIdwithissue-Nor a number needsownerPubkeyandrepoId. GitLab sources stay Nostr-only.createIssuelistIssueComments,createIssueComment— Nostr comments on a 64-character id. Forge comments when the id isissue-Nor a number (read-only; the website does not post them back to GitHub).closeIssue,reopenIssue— publish NIP-34 status events (1632 / 1630) for a 64-char Nostr event id. GitHub/Gitea importedissue-12/pr-12(and a bare12) are refused — close those on the origin.
Pull requests (code review flow)
Step | Tool | Notes |
List / open PR |
| List matches the website: Nostr kind 1618 plus GitHub or Codeberg/Gitea |
Comment on PR |
| Nostr comments on a 64-character id. |
Full PR with git branches |
| Recommended when the agent has |
Update PR tip |
| New commit + clone URLs on the PR event. |
Merge into |
| Real git merge of a Nostr PR (kind 1618 event id): clone/fetch, merge, push bridge, publish 30618 + merged status 1631. Forge |
Mark merged (Nostr only) |
| Status only — no git merge. |
Honest limits on PRs: Creating and listing PRs via MCP is supported. Merging needs git installed and permission on the repo. Some relays are strict about clone URL + relay matching in repo announcements — if PR publish fails, fix metadata (see Limitations) or use createPRViaGittrCLI. Details: docs/DEVELOPER.md#limitations.
Fork, mirror, import
forkRepo— fork an existing gittr repo under your key.mirrorRepo— same result as the website Push of a GitHub/GitLab repo: forge commits on gittr (history kept, and a later call updates them), the same git-server list, and a state event whoseHEADis the forge default branch. A later call keeps the name, description, and web links already announced.importRemoteToBridge— copy onto the git server only. With the owner key, a later call updates the forge commits. It does not publish the Nostr card. UsemirrorRepofor the full website result.Forge 403 / suspended account: if the repo was already copied, keep using
https://git.gittr.space/<npub>/<repo>.git. Do not pointmirrorRepoat a new forge to change the source — that copies the new URL onto gittr and replaces the branches. Guide: docs/AGENT-WORKFLOW.md.
Discover & social
listRepos,searchRepos,myRepos,exploreRepos,getTrendingRepos(trending = recent repos, not engagement rank)starRepo,unstarRepo,listStars— NIP-25 on the repo’s 30617 event (same as gittr Star button).watchRepo,unwatchRepo,listWatchedRepos— NIP-51 kind 10018 followed-repo list (same as gittr Watch).getRepoContributors
Parity details: docs/MCP-GITTR-PARITY.md — what matches gittr.space vs caveats.
Releases & tags
listReleases— git tags from bridge (refs/tags/*), not the web UI Releases tab and not Zapstore.listForgeReleases— forge Releases tab listing (all assets; no NIP-82 MIME gate).createRelease— returns guidance only (UI release notes until next 30617 push).fetchForgeReleases— one forge Release + announceable binaries. Omittagfor latest;hash:truefor sha256 (required before announce).announceSoftwareFromForgeRelease— Zapstore/NIP-82 (kinds 32267 / 30063 / 3063) from a tagged forge Release. APK preferred; AppImage/DMG/linuxtar.gz/MSI/EXE/IPA also. Extra binaries on the same tag are sibling assets. Copiesimages:from the forgezapstore.yaml. OptionalpinToBlossom(public Blossom;blossom.gittr.spaceonly for officialspace.gittr.app). Same as gittr Nostr Apps (latest) or Releases Announce on Nostr (tag=). Never a tagless app.deleteSoftwareAnnounce— NIP-09 kind 5 for those app/release/asset event ids.
Pages & security
publishNostrPages— NIP-5A kind 35128 + Blossom upload through gittr (index.htmlrequired).auditRepoDependencies— parse lockfiles on the bridge and query OSV via gittr/api/security/audit.
Lightning bounties & pay-to-push
Bounties:
listBounties,createBountyInvoice,publishBountyToNostr,submitBounty,listBountiesForIssue, release/withdraw tools.Paywall:
getPushPaywallStatus,createPushPaywallIntent,syncRepoPushPolicy.Optional LNbits: set
GITTR_LNBITS_URLandGITTR_LNBITS_ADMIN_KEYin MCP env (see.env.example).
Session / keys
describeAgentAuth— run once: confirms keys load (never returnsnsec); if unconfigured it tells the agent to ask you about a test keypair.setupTestKeypair— after your explicit OK, writes a disposable test identity to.nostr-keys.json(replace with your realnsecanytime).loadCredentials,getPublicKey— debugging helpers. MCPloadCredentialsmasksnsec(prefix only),secretKey, andprivate_key.
Full tool list: 50+ tools in server.js (search for name:). Library API: docs/DEVELOPER.md.
Install (5 minutes)
Requirements
Node.js 18+
A Nostr private key (
nsecor hex) — same identity you use on gittr.space
1. Get the server
Clone (developers / Cursor):
git clone https://github.com/arbadacarbaYK/gittr-mcp.git
cd gittr-mcp
npm installClaude Desktop one-click (.mcpb): this package is not on npm. Download the latest bundle from GitHub Releases (gittr-mcp-x.y.z.mcpb) and install that. New releases are built automatically when we push a v* tag — see docs/RELEASE.md.
2. Add your key (local only, never commit)
cp .nostr-keys.json.example .nostr-keys.jsonEdit .nostr-keys.json and set your nsec (or hex secretKey). The file is gitignored.
Lookup order: ./.nostr-keys.json (the folder the MCP process was started in) → .nostr-keys.json next to server.js → ~/.nostr-identity.json → ~/.config/gittr/keys.json. On Windows, the home folder is used even when HOME is unset. A UTF-8 BOM (PowerShell’s default) is stripped before the file is read.
No key yet? Test keypair flow. If no credentials are found, describeAgentAuth and all key-missing errors tell the agent to ask you whether a disposable test keypair should be created. If you agree, the agent calls setupTestKeypair({ confirm: true }) — it writes a fresh identity into .nostr-keys.json (flagged "generated": true, file mode 600, never committed) and everything auto-loads it from then on. Replace the nsec in that file with your real key whenever you're ready; describeAgentAuth keeps reminding the agent that a test key is active. It never runs without confirm: true and never overwrites existing credentials unless you explicitly ask for force: true — anything published under a keypair stays under that identity forever, so this is always your call, not the agent's.
3. Wire up your MCP host
Important: Add a new server entry — do not replace your entire MCP config.
Cursor
Edit ~/.cursor/mcp.json (or project MCP settings). Use an absolute path:
{
"mcpServers": {
"gittr": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/gittr-mcp/server.js"],
"env": {
"BRIDGE_URL": "https://gittr.space"
}
}
}
}Reload MCP or restart Cursor.
Claude Desktop
Quit Claude, edit claude_desktop_config.json (path depends on OS — see Anthropic docs), same mcpServers block as above, restart.
VS Code / Copilot, Windsurf, OpenClaw, custom apps
Same stdio contract: command: node, args: ["/path/to/server.js"], optional env.
OpenClaw / mcporter: docs/MCP-HOSTS.md.
Embed as a library (no MCP)
const gittr = require('gittr-mcp');
await gittr.pushToBridge({ /* ... */ });Entry point: index.js. MCP process: server.js (npm bin gittr-mcp).
4. Verify
In chat, ask the agent to call describeAgentAuth, or from the repo:
npm test # full package (includes clone-set + forge-match regressions)
npm run test:regressions # fast: grasp clone URLs + findReposBySource matchers
npm run test:mcp-stdio # optional live stdio CallTool matrixUI / file-fetch tip fidelity regressions live in the gittr monorepo: cd ../gittr/ui && npm run test:regressions (see gittr docs/FILE_FETCHING_INSIGHTS.md).
What to ask your agent
Examples that map to the workflows above:
“Create a repo
my-demowith a README and publish it on gittr.”“Push these file changes to
my-demoonmain.”“Open an issue: login button broken.”
“List open PRs on npub…/my-demo and merge PR
<id>if I’m the owner.”“Mirror
https://github.com/user/repoto gittr asrepo-name.”
Agents should read tool results as JSON; many responses include agentSummary and nextSteps.
Limitations (PRs & clone URLs)
Short version — full detail in docs/DEVELOPER.md:
Bridge push and Nostr publish are separate steps unless you use
createRepo. Pushing alone does not make the repo visible everywhere.git cloneonly “works” for others if your publishedcloneURL serves git HTTP. This MCP defaults towardhttps://git.gittr.space/<hex-pubkey>/<repo>.git. A failed clone means fix the URL in 30617, not “ignore and continue.” Host-only values likehttps://git.gittr.spaceare rejected/expanded on publish.mergePullRequestneedsgiton the machine running MCP and maintainer/owner rights.Relays can rate-limit or lag; failed verification is a failed publish, not “maybe OK.”
Same result as the website Push.
mirrorRepocopies the forge commits (and updates them if the repo is already there), then writesclonefor gittr, ngit, gitnostr, shakespeare, and danconway, keeps the forge URL insource, and publishes the branch tips withHEADon the forge default branch. A second call keeps the existing name, description, and web links. Dead hosts (git-01.uid.ovh,ngit-relay.nostrver.se) are not added.pushToBridgereplaces the branch with one new snapshot (authorgittr push) and drops imported GitHub history. That matches editing files on the website, not syncing GitHub. Do not use it aftermirrorRepo.
Do MCP users get gittr’s filter / CORS server fixes?
Mostly yes, without updating MCP. Browser/filter/uploadpack/CORS fixes live on git.gittr.space. Anyone (including agents via MCP) cloning that host benefits as soon as the server is fixed.
MCP updates are a new version, not an npm package. This project is not installed from the npm registry. Cursor runs node on a local server.js. Claude can install the .mcpb file from GitHub Releases.
Cursor: in the folder whose path ends with
gittr-mcp/server.js, rungit pull, then reload the MCP.npm installis only the first-time library download in that folder. A normal update does not need it.Release file: install the new
gittr-mcp-x.y.z.mcpbfrom Releases. The old 1.0.9 file does not include later fixes. The version shown at startup is the way to tell them apart.
For developers
npm ci
npm test
# Live tests (real relays; optional LNbits) — see .env.example
GITTR_TEST_NSEC=nsec1... npm run test:live:matrixDoc | Contents |
Per-host MCP config | |
Which tool for which job | |
Copy-paste agent prompts | |
API, verification contract, GRASP | |
Keys and NIP-98 | |
Event kinds | |
MCP vs gittr.space feature map |
Security
Do not commit
.nostr-keys.json,.env, or realnsecvalues.Bridge auth uses NIP-98; treat agent transcripts as sensitive.
Only
.nostr-keys.json.examplebelongs in git.The gittr Dependencies tab can list matches inside the MCP SDK. gittr-mcp talks stdio only (it is a server, not an OAuth client).
@modelcontextprotocol/sdkstays on ^1.32.1 or newer so CVE-2026-104850 is not in the lockfile.overridespin patchedfast-uri,hono,qs, and zod 4.6.7 (CVE-2023-54404 — the server does not parse visitor arrays with Zod). Details: docs/SECURITY-ADVISORIES.md.
Links
This repo: https://github.com/arbadacarbaYK/gittr-mcp
gittr.space: https://gittr.space
Awesome MCP Servers: https://github.com/punkpeye/awesome-mcp-servers (Version Control)
NIP-34 (git on Nostr): https://github.com/nostr-protocol/nips/blob/master/34.md
See LICENSE (MIT).
Available Tools
75 toolsaddCollaboratorB
Add maintainer on kind 30617 (republishes full announcement with updated maintainers tag — matches gittr UI)
Inputs: repoId (required), ownerPubkey (required), collaboratorPubkey (required), relays, +1 more.
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.
Inputs: sourceUrl (required), tag, appId, relays, +14 more.
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.
Inputs: branch, repoId, packages, ownerPubkey.
bountyClaimWithdrawD
POST /api/bounty/claim-withdraw — claim withdraw to recipient
Inputs: lnurl, bridgeUrl, issueRepo, lnbitsUrl, +5 more.
bountyCreateWithdrawC
POST /api/bounty/create-withdraw — LNURL-withdraw for bounty flow
Inputs: amount (required), issueId (required), title, bridgeUrl, +3 more.
bountyReleaseC
POST /api/bounty/release — pay bounty to recipient Lightning address
Inputs: bountyId (required), bountyAmount (required), recipientPubkey (required), bridgeUrl, +4 more.
bridgeGetFileContentC
GET /api/nostr/repo/file-content — raw file from bridge
Inputs: path (required), repo (required), ownerPubkey (required), branch, +1 more.
bridgeListCommitsD
GET /api/nostr/repo/commits
Inputs: repo (required), ownerPubkey (required), limit, branch, +1 more.
bridgeListFilesC
GET /api/nostr/repo/files — list files for branch
Inputs: repo (required), ownerPubkey (required), branch, bridgeUrl, +1 more.
bridgeListRefsD
GET /api/nostr/repo/refs
Inputs: repo (required), ownerPubkey (required), bridgeUrl.
bridgeRepoExistsC
GET /api/nostr/repo/exists — check if repo exists on bridge
Inputs: repo (required), ownerPubkey (required), bridgeUrl.
closeIssueC
Convenience: publish status 1632 (closed) for an issue
Inputs: repoId (required), issueId (required), privkey (required), ownerPubkey (required), +2 more.
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.
Inputs: amount (required), issueId (required), lnbitsUrl, description, +1 more.
createIssueA
Create an issue - REQUIRES signing
Inputs: relays (required), repoId (required), privkey (required), subject (required), +3 more.
createIssueCommentA
Publish a NIP-22 comment (kind 1111) on an issue. Optional replyTo for threaded replies. Does not create/modify bounty (9806) events.
Inputs: content (required), issueId (required), privkey (required), relays, +3 more.
createPRC
Create a pull request - REQUIRES signing
Inputs: relays (required), repoId (required), privkey (required), subject (required), +6 more.
createPRCommentB
Publish a NIP-22 comment (kind 1111) on a pull request. Optional replyTo for threaded replies.
Inputs: prId (required), content (required), privkey (required), relays, +3 more.
createPRViaGittrCLIA
Create PR via gittr CLI - full flow including git push (RECOMMENDED for PRs)
Inputs: repo (required), title (required), privkey (required), base, +2 more.
createPushPaywallIntentC
POST push-payment action create_intent — invoice for pay-to-push (owner wallet keys in body)
Inputs: repo (required), ownerPubkey (required), payerPubkey (required), bridgeUrl, +4 more.
createReleaseD
Not supported for UI release notes. For Zapstore/NIP-82 announce use announceSoftwareFromForgeRelease. For git tags use listReleases + publishRepoState.
Inputs: repoId (required), version (required), ownerPubkey (required), relays, +3 more.
createRepoA
CREATE A REPO IN ONE CALL - Push files AND publish to Nostr. Best for agents! Auto-loads credentials from .nostr-keys.json.
Inputs: name (required), files, branch, pubkey, +6 more.
deleteRepoC
Alias for softDeleteRepo — soft-delete a NIP-34 repository (owner only).
Inputs: repoId (required), name, relays, privkey, +1 more.
deleteSoftwareAnnounceA
NIP-09 kind 5 deletion for previously published NIP-82 app/release/asset event ids (does not delete the git repo).
Inputs: eventIds (required), relays, privkey, ownerPubkey.
describeAgentAuthA
Show whether Nostr keys are loaded (hex/npub only — never returns private key). Use first in a session.
Inputs: no named parameters.
exploreReposC
Explore repositories by category/topic
Inputs: limit, relays, category.
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).
Inputs: sourceUrl (required), tag, hash.
findReposByGithubB
Alias for findReposBySource (exact forge URL → npub). Prefer findReposBySource for non-GitHub forges.
Inputs: limit, github, relays, source, +2 more.
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.
Inputs: limit, github, relays, source, +2 more.
forkRepoC
Fork an existing repository
Inputs: newRepoName (required), sourceRepoId (required), relays, privkey, +4 more.
getBranchesC
Get branches for a repository
Inputs: repoId (required), ownerPubkey (required), relays.
getCommitHistoryC
Get commit history for a repository
Inputs: repoId (required), ownerPubkey (required), limit, branch, +1 more.
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.
Inputs: repoId (required), filePath (required), ownerPubkey (required), branch.
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.
Inputs: issueId (required), relays, repoId, ownerPubkey.
getPublicKeyC
Get public key from private key
Inputs: privkey (required).
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.
Inputs: prId (required), relays, repoId, ownerPubkey.
getPushPaywallStatusC
GET /api/nostr/repo/push-payment — push cost and whether payer has paid intent
Inputs: repo (required), ownerPubkey (required), bridgeUrl, payerPubkey, +3 more.
getRepoA
Get a single repository by ID or owner+name
Inputs: repoId (required), relays, ownerPubkey.
getRepoContributorsB
Get contributors to a repository
Inputs: repoId (required), ownerPubkey (required), relays.
getTrendingReposC
Get trending/popular repositories
Inputs: limit, relays, timeRange.
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.
Inputs: repo (required), cloneUrl (required), ownerPubkey (required), bridgeUrl.
listBountiesC
Discover open bounties (issues with bounty labels or Lightning funding)
Inputs: limit, relays, minAmount.
listBountiesForIssueA
List kind 9806 bounty events linked to an issue id
Inputs: issueId (required), limit, relays.
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).
Inputs: sourceUrl (required).
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.
Inputs: issueId (required), limit, relays, repoId, +1 more.
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.
Inputs: repoId (required), ownerPubkey (required), labels, relays.
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.
Inputs: prId (required), limit, relays, repoId, +1 more.
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.
Inputs: repoId (required), ownerPubkey (required), relays.
listReleasesA
List git tags from the bridge (refs/tags/*), not Zapstore software releases and not the website Releases tab
Inputs: repoId (required), ownerPubkey (required), limit, relays.
listReposB
Discover repositories from Nostr relays (NIP-34). Filter by pubkey or search term.
Inputs: limit, pubkey, relays, search.
listStarsA
List repos a user starred (kind 7 with #k 30617 and #e pointing at 30617 events; latest reaction per repo wins)
Inputs: pubkey, relays.
listWatchedReposA
List repos from your latest kind 10018 followed-repos event on relays
Inputs: pubkey, relays.
loadCredentialsA
Load Nostr credentials from .nostr-keys.json (for debugging)
Inputs: no named parameters.
markPullRequestMergedC
Convenience: publish status 1631 (merged/applied) for a PR root event
Inputs: prId (required), repoId (required), privkey (required), ownerPubkey (required), +3 more.
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.
Inputs: prId (required), privkey (required), ownerPubkey (required), relays, +4 more.
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.
Inputs: repoName (required), sourceUrl (required), web, name, +5 more.
myReposA
List repositories owned by the current user (from .nostr-keys.json)
Inputs: relays.
publishBountyToNostrC
Publish gittr bounty metadata event (kind 9806)
Inputs: amount (required), issueId (required), privkey (required), repoName (required), +9 more.
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).
Inputs: dTag, files, title, branch, +9 more.
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.
Inputs: name (required), repoId (required), web, clone, +5 more.
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.
Inputs: refs (required), repoId (required), branch, relays, +1 more.
publishSoftwareAnnounceB
Low-level: publish NIP-82 events from an already-fetched forge payload (ok:true + hashed announceable binary). Prefer announceSoftwareFromForgeRelease.
Inputs: forge (required), privkey (required), appId, relays, +13 more.
publishStatusForRootB
Publish NIP-34 status (1630 open, 1631 merged/applied, 1632 closed, 1633 draft) for an issue, PR, or patch root event
Inputs: privkey (required), statusKind (required), ownerPubkey (required), rootEventId (required), +8 more.
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.
Inputs: repo (required), ownerPubkey (required), files, branch, +4 more.
reopenIssueC
Convenience: publish status 1630 (open) for an issue
Inputs: repoId (required), issueId (required), privkey (required), ownerPubkey (required), +2 more.
resolveRepoByNostrIdA
Resolve repo by Nostr identity (npub or hex) and repo name. Returns cloneUrl (prefer git.gittr.space), cloneUrls, relays for location-agnostic use.
Inputs: repoId (required), ownerNpubOrHex (required), relays.
searchReposB
Full-text search across repository names and descriptions
Inputs: query (required), limit, relays.
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.
Inputs: force, confirm.
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.
Inputs: repoId (required), name, relays, privkey, +1 more.
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.
Inputs: repoId (required), ownerPubkey (required), relays, privkey, +1 more.
submitBountyB
Submit work on a bounty (claim it with PR/evidence)
Inputs: prUrl (required), issueId (required), evidence (required), relays, +1 more.
syncRepoPushPolicyB
POST /api/nostr/repo/push-policy-sync — upsert push paywall from signed kind 30617 (use announcement event JSON from publishRepoAnnouncement)
Inputs: signedAnnouncementEvent (required), bridgeUrl.
unstarRepoA
Unstar a repo (NIP-25 kind 7 on the 30617 event with content "-"). Same tags as starRepo.
Inputs: repoId (required), ownerPubkey (required), relays, privkey, +1 more.
unwatchRepoB
Unwatch a repo (republish kind 10018 without this repo)
Inputs: repoId (required), ownerPubkey (required), relays, privkey.
updatePullRequestB
Publish NIP-34 PR update (kind 1619): new tip commit + clone URLs
Inputs: repoId (required), privkey (required), cloneUrls (required), ownerPubkey (required), +6 more.
watchRepoA
Watch a repo (NIP-51 kind 10018 followed-repos list — publishes full a tag set, same as gittr Watch button)
Inputs: repoId (required), ownerPubkey (required), relays, privkey.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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.
Maintenance
Related MCP Connectors
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server to provide AI agents money functionalities via Nostr and Cashu.678 npm17MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that equips AI agents with dev workflow tools including GitHub project management, conventional commits, visual regression testing, Jira/Confluence integration, and a persistent memory knowledge graph.11 npmMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides tools for interacting with Git repositories, enabling AI assistants to manage repositories, branches, commits, and files through a standardized interface.4,360 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA secure and scalable Git MCP server giving AI agents powerful version control for local and (soon) serverless environments.145 npmApache 2.0