Git on Nostr via gittr.space: repos, push, issues, PRs, stars, bounties. Nostr identity (NIP-34).
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Let your AI agent (or app) use gittr.space 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.
| 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 verification / nextSteps for automation |
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.
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).
| Piece | Host / link | How MCP uses it |
|---|---|---|
| gittr Client | gittr on gittr.space Β· gittr.space | Same product; MCP mirrors forge actions (repos, issues, PRs, bounties) |
| gitnostr Bridge | gitnostr on gittr.space Β· git.gittr.space | pushToBridge, file list, merge clones over HTTPS |
| Pages / nsite | nsite-gateway Β· pages.gittr.space | Out of band for most MCP git tools |
| gittr Pyramid relay | pyramid Β· relay.gittr.space | Prefer in relay lists when publishing NIP-34 |
| β gittr-mcp (this README) | gittr-mcp on gittr.space | You are here |
| git remote nostr | ngit-cli | 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.
These are the processes people actually run; each maps to MCP tools the agent can call.
createRepo β push initial files to the bridge and publish Nostr kinds 30617 + 30618 in one step (best default for agents).publicRead: false to 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.pushToBridge β publishRepoAnnouncement β publishRepoState.publicRead: false on createRepo, publishRepoAnnouncement, forkRepo, or mirrorRepo.addCollaborator or Settings β Contributors on gittr.space).pushToBridge β update files on a branch (NIP-98 auth to gittr bridge); optional deletedPaths / allowTreeShrink for file or folder deletes (parity with Code-tab trash).getFile, bridgeListFiles, bridgeGetFileContent, getBranches, getCommitHistory β read repo state without cloning. (getFile β bridge + a few GRASP raw URLs; for Code-tab parity see MCP-GITTR-PARITY.md and gittr FILE_FETCHING_INSIGHTS.)resolveRepoByNostrId β find clone URLs and relays from npub + repo name.listIssues, createIssue, getIssueByIdcloseIssue, reopenIssue β publish NIP-34 status events (1632 / 1630).| Step | Tool | Notes |
|---|---|---|
| List / open PR | listPRs, createPR | Signed Nostr events (kind 1618). |
| Full PR with git branches | createPRViaGittrCLI | Recommended when the agent has git on PATH. |
| Update PR tip | updatePullRequest | New commit + clone URLs on the PR event. |
Merge into main | mergePullRequest | Real git merge: clone/fetch, merge, push bridge, publish 30618 + merged status 1631. Repo owner or listed maintainer; git required. |
| Mark merged (Nostr only) | markPullRequestMerged | 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.
forkRepo β fork an existing gittr repo under your key.mirrorRepo β copy from GitHub/GitLab URL to gittr.importRemoteToBridge β server-side import/refetch into bridge storage.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).getRepoContributorsParity details: docs/MCP-GITTR-PARITY.md β what matches gittr.space vs caveats.
listReleases β git tags from bridge (refs/tags/*), not the web UI βReleasesβ notes.createRelease β returns guidance only (UI release notes until next 30617 push).fetchForgeReleases β latest public forge Release + APKs (hash:true for sha256).announceSoftwareFromForgeRelease β Zapstore/NIP-82 announce (kinds 32267 / 30063 / 3063) from a forge Release APK (same as Code sidebar Announce app).deleteSoftwareAnnounce β NIP-09 kind 5 for those app/release/asset event ids.listBounties, createBountyInvoice, publishBountyToNostr, submitBounty, listBountiesForIssue, release/withdraw tools.getPushPaywallStatus, createPushPaywallIntent, syncRepoPushPolicy.GITTR_LNBITS_URL and GITTR_LNBITS_ADMIN_KEY in MCP env (see .env.example).describeAgentAuth β run once: confirms keys load (never returns nsec); 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 real nsec anytime).loadCredentials, getPublicKey β debugging helpers. MCP loadCredentials masks nsec (prefix only), secretKey, and private_key.Full tool list: 50+ tools in server.js (search for name:). Library API: docs/DEVELOPER.md.
nsec or hex) β same identity you use on gittr.spaceClone (developers / Cursor):
Claude Desktop one-click (.mcpb): download the latest bundle from GitHub Releases (gittr-mcp-x.y.z.mcpb). New releases are built automatically when we push a v* tag β see docs/RELEASE.md.
Edit .nostr-keys.json and set your nsec (or hex secretKey). The file is gitignored.
Lookup order: ./.nostr-keys.json β ~/.nostr-identity.json β ~/.config/gittr/keys.json.
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.
Important: Add a new server entry β do not replace your entire MCP config.
Edit ~/.cursor/mcp.json (or project MCP settings). Use an absolute path:
Reload MCP or restart Cursor.
Quit Claude, edit claude_desktop_config.json (path depends on OS β see Anthropic docs), same mcpServers block as above, restart.
Same stdio contract: command: node, args: ["/path/to/server.js"], optional env.
OpenClaw / mcporter: docs/MCP-HOSTS.md.
Entry point: index.js. MCP process: server.js (npm bin gittr-mcp).
In chat, ask the agent to call describeAgentAuth, or from the repo:
UI / file-fetch tip fidelity regressions live in the gittr monorepo: cd ../gittr/ui && npm run test:regressions (see gittr docs/FILE_FETCHING_INSIGHTS.md).
Examples that map to the workflows above:
my-demo with a README and publish it on gittr.βmy-demo on main.β<id> if Iβm the owner.βhttps://github.com/user/repo to gittr as repo-name.βAgents should read tool results as JSON; many responses include agentSummary and nextSteps.
Short version β full detail in docs/DEVELOPER.md:
createRepo. Pushing alone does not make the repo visible everywhere.git clone only βworksβ for others if your published clone URL serves git HTTP. This MCP defaults toward https://git.gittr.space/<hex-pubkey>/<repo>.git. A failed clone means fix the URL in 30617, not βignore and continue.β Host-only values like https://git.gittr.space are rejected/expanded on publish.mergePullRequest needs git on the machine running MCP and maintainer/owner rights.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 package updates are separate. Cursor/Claude do not auto-pull new MCP code. To get new tools or clone-tag logic:
cd gittr-mcp && git pull && npm install, then reload MCP / restart the host.mcpb: download the latest from Releases and reinstall the bundle| Doc | Contents |
|---|---|
| docs/MCP-HOSTS.md | Per-host MCP config |
| docs/AGENT-WORKFLOW.md | Step-by-step push + publish |
| docs/AGENT-QUICKSTART.md | Copy-paste agent prompts |
| docs/DEVELOPER.md | API, verification contract, GRASP |
| docs/SIGNING-GUIDE.md | Keys and NIP-98 |
| docs/NIP34-SCHEMAS.md | Event kinds |
| docs/MCP-GITTR-PARITY.md | MCP vs gittr.space feature map |
.nostr-keys.json, .env, or real nsec values..nostr-keys.json.example belongs in git.MIT License.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/gittr-mcp)<a href="https://allmcps.com/mcp/gittr-mcp"><img src="https://allmcps.com/api/badge/gittr-mcp?style=directory" alt="Gittr Mcp on AllMCPs" /></a>