Sign inSign up

richarvey/forgejo-mcp

By richarvey

Updated 7 months ago

MCP server for Forgejo/Gitea - AI assistants interact with repos, issues, PRs & more

Image
0

7.0K

richarvey/forgejo-mcp repository overview

forgejo-mcp

A Model Context Protocol (MCP) server for Forgejo and Gitea instances. Enables AI assistants like Claude, Cursor, and other MCP-compatible tools to interact with your Forgejo/Gitea repositories, issues, pull requests, and more.

Features

  • Comprehensive API coverage (102 tools across 6 categories)
  • Configurable base URL - works with any Forgejo or Gitea instance
  • Both stdio and HTTP transport modes
  • Token-based authentication with optional HTTP Bearer auth
  • Input validation and security hardening (path traversal protection, SSRF prevention, rate limiting)
  • Docker support with security-hardened container

Quick Start

Prerequisites
  • Node.js 18+
  • A Forgejo or Gitea instance
  • API token (generate at {your-instance}/user/settings/applications)
Installation
npm install -g @ric_/forgejo-mcp

Or run directly:

npx @ric_/forgejo-mcp
Configuration

Set environment variables:

export FORGEJO_URL=https://your-forgejo-instance.com
export FORGEJO_TOKEN=your-api-token

Or pass as CLI args:

npx @ric_/forgejo-mcp --url https://your-instance.com --token your-token

Usage

With Claude Code

You can add the MCP server using the CLI:

claude mcp add-json forgejo '{"command":"npx","args":["@ric_/forgejo-mcp"],"env":{"FORGEJO_URL":"https://your-instance.com","FORGEJO_TOKEN":"your-token"}}'

Or manually edit the config file:

  • Project scope (shared with team): .mcp.json in your project root
  • User scope (personal, all projects): ~/.claude.json

Add the following to the mcpServers object:

{
  "mcpServers": {
    "forgejo": {
      "command": "npx",
      "args": ["@ric_/forgejo-mcp"],
      "env": {
        "FORGEJO_URL": "https://your-instance.com",
        "FORGEJO_TOKEN": "your-token"
      }
    }
  }
}

You can verify the server is connected by running /mcp inside Claude Code.

With Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "forgejo": {
      "command": "npx",
      "args": ["@ric_/forgejo-mcp"],
      "env": {
        "FORGEJO_URL": "https://your-instance.com",
        "FORGEJO_TOKEN": "your-token"
      }
    }
  }
}
HTTP Mode

For remote/shared access:

FORGEJO_URL=https://your-instance.com \
FORGEJO_TOKEN=your-token \
FORGEJO_MCP_API_KEY=your-secret-api-key \
npx @ric_/forgejo-mcp-http --port 3000

Endpoint: http://localhost:3000/mcp

Authentication: Set FORGEJO_MCP_API_KEY to require Bearer token authentication on the HTTP endpoint. Clients must include Authorization: Bearer your-secret-api-key in requests. If not set, the endpoint is unauthenticated (only suitable for localhost or behind a reverse proxy).

Rate Limiting: Enabled by default at 100 requests/minute per IP. Configure via:

  • RATE_LIMIT_MAX - max requests per window (default: 100)
  • RATE_LIMIT_WINDOW_MS - window size in milliseconds (default: 60000)
Docker

Pull from Docker Hub:

docker run -p 3000:3000 \
  -e FORGEJO_URL=https://your-instance.com \
  -e FORGEJO_TOKEN=your-token \
  -e FORGEJO_MCP_API_KEY=your-secret-key \
  richarvey/forgejo-mcp

Or use docker-compose:

cp .env.example .env
# Edit .env with your values, then:
docker compose up -d

Or build from source:

docker build -t forgejo-mcp .
docker run -p 3000:3000 \
  -e FORGEJO_URL=https://your-instance.com \
  -e FORGEJO_TOKEN=your-token \
  -e FORGEJO_MCP_API_KEY=your-secret-key \
  forgejo-mcp

The Docker image:

  • Uses multi-stage build for minimal image size
  • Runs as non-root user
  • Read-only filesystem
  • No new privileges security option

Available Tools

Repository Management (24 tools)
ToolDescription
search_reposSearch repositories
get_repoGet repository details
create_repoCreate a new repository
create_org_repoCreate repo in an organization
delete_repoDelete a repository
fork_repoFork a repository
list_branchesList branches
get_branchGet branch details
create_branchCreate a branch
delete_branchDelete a branch
list_repo_commitsList commits
get_file_contentsGet file contents
create_fileCreate a file
update_fileUpdate a file
delete_fileDelete a file
list_releasesList releases
create_releaseCreate a release
list_tagsList tags
list_repo_topicsList topics
update_repo_topicsUpdate topics
list_forksList forks
list_collaboratorsList collaborators
add_collaboratorAdd a collaborator
transfer_repoTransfer repository
Issue Management (20 tools)
ToolDescription
list_issuesList repository issues
get_issueGet issue details
create_issueCreate an issue
edit_issueEdit an issue
list_issue_commentsList issue comments
create_issue_commentAdd a comment
edit_issue_commentEdit a comment
delete_issue_commentDelete a comment
list_labelsList repository labels
get_labelGet label details
create_labelCreate a label
edit_labelEdit a label
delete_labelDelete a label
add_issue_labelsAdd labels to issue
remove_issue_labelRemove label from issue
list_milestonesList milestones
get_milestoneGet milestone details
create_milestoneCreate a milestone
edit_milestoneEdit a milestone
delete_milestoneDelete a milestone
Pull Request Management (12 tools)
ToolDescription
list_pull_requestsList pull requests
get_pull_requestGet PR details
create_pull_requestCreate a pull request
edit_pull_requestEdit a pull request
merge_pull_requestMerge a pull request
list_pr_commitsList PR commits
list_pr_filesList changed files
get_pr_diffGet PR diff
list_pr_reviewsList PR reviews
create_pr_reviewCreate a review
request_pr_reviewRequest reviewers
update_pr_branchUpdate PR branch
Organization Management (14 tools)
ToolDescription
list_orgsList organizations
get_orgGet org details
create_orgCreate organization
edit_orgEdit organization
delete_orgDelete organization
list_org_reposList org repositories
list_org_membersList org members
list_org_teamsList org teams
get_teamGet team details
create_teamCreate a team
add_team_memberAdd team member
remove_team_memberRemove team member
list_org_labelsList org labels
list_org_hooksList org webhooks
User Management (13 tools)
ToolDescription
get_authenticated_userGet current user
get_userGet user profile
list_user_reposList user repositories
list_user_orgsList user organizations
search_usersSearch users
list_followersList followers
list_followingList following
list_user_starredList starred repos
list_my_starredList my starred repos
star_repoStar a repository
unstar_repoUnstar a repository
list_my_notificationsList notifications
mark_notifications_readMark all as read
Admin & System (19 tools)
ToolDescription
admin_list_usersList all users (admin)
admin_create_userCreate user (admin)
admin_delete_userDelete user (admin)
admin_edit_userEdit user (admin)
admin_list_cron_jobsList cron jobs
admin_run_cron_jobRun cron task
admin_list_hooksList system webhooks
get_server_versionGet server version
render_markdownRender markdown
render_markupRender markup
list_gitignore_templatesList gitignore templates
get_gitignore_templateGet gitignore template
list_license_templatesList license templates
get_license_templateGet license template
list_label_templatesList label templates
get_label_templateGet label template
get_nodeinfoGet instance info
list_action_runners_jobsList action jobs
get_runner_registration_tokenGet runner token

Security

Environment Variables
VariableRequiredDescription
FORGEJO_URLYesBase URL of your Forgejo/Gitea instance
FORGEJO_TOKENYesAPI token (generate here)
FORGEJO_MCP_API_KEYNoBearer token for HTTP endpoint authentication
RATE_LIMIT_MAXNoMax requests per rate limit window (default: 100)
RATE_LIMIT_WINDOW_MSNoRate limit window in ms (default: 60000)
PORTNoHTTP server port (default: 3000)
Security Features
  • Input validation - All parameters validated with Zod schemas (path traversal prevention, regex-validated usernames, bounded pagination, enum enforcement)
  • SSRF protection - Base URL validated against cloud metadata endpoints and private IP ranges
  • HTTP authentication - Optional Bearer token auth for the HTTP transport
  • Rate limiting - Per-IP rate limiting on HTTP endpoints
  • Token safety - API tokens never leaked in error messages; URLs sanitized in errors
  • Security headers - X-Content-Type-Options: nosniff, X-Frame-Options: DENY
  • Non-root Docker - Container runs as unprivileged user with read-only filesystem
Best Practices
  • Always use HTTPS for your Forgejo instance URL
  • Use short-lived API tokens with minimal required permissions
  • Set FORGEJO_MCP_API_KEY when running HTTP mode on a network
  • Admin tools require an admin-level Forgejo token - use a non-admin token if you don't need them

Development

git clone https://code.squarecows.com/SquareCows/forgejo-mcp.git
cd forgejo-mcp
npm install
npm run dev          # stdio mode
npm run dev:http     # HTTP mode
npm test             # run tests
npm run build        # compile TypeScript

Compatible Instances

This MCP server works with:

Contributing

Contributions welcome! Please see CONTRIBUTING.md for guidelines.

License

MIT - see LICENSE

Tag summary

Content type

Image

Digest

sha256:ceb4dfe30

Size

57.3 MB

Last updated

7 months ago

docker pull richarvey/forgejo-mcp