Atlas / MCP servers / pxsloot / gitea-mcp-server

gitea-mcp-serverSAFE

mcp/pxsloot/gitea-mcp-server

Gitea MCP Server – A Model Context Protocol implementation for Gitea. Provides tools and resources for AI agents to interact with Gitea repositories, issues, pull requests, and more, much more. Built with FastMCP for seamless Gitea integration.

Verdict
SAFE
Grade
B
Trust score
85 /100
Exposed tools
44 44r · 0w · 0d
Transport
—
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/pxsloot/gitea-mcp-server/actions/workflows/ci.yml) [](pyproject.toml) [](LICENSE) [](https://github.com/astral-sh/ruff)

Model Context Protocol server that provides ~400 auto-generated tools and resources for LLM agents to interact with Gitea and Forgejo instances. Built with FastMCP 3.x.

How it works

Your Gitea/Forgejo instance
│
▼  (Swagger/OpenAPI spec)
gitea-mcp-server
│  ┌────────────────────────────┐
│  │ Auto-generates ~400 tools  │
│  │ from the API spec          │
│  │ Adds lazy loading, scope   │
│  │ filtering, annotations,    │
│  │ workflow guides, resources │
│  └────────────────────────────┘
│
▼  (MCP protocol: stdio or HTTP)
Your LLM agent
│
├─ call_tool("gitea_issue_create_issue", ...)
├─ read_resource("gitea://repos/owner/repo")
└─ search_tools("list pull requests")

Requirements

  • Python 3.11+ and uv (package manager)
  • A Gitea or Forgejo instance (local or remote)
  • An API token with sufficient scopes (Settings → Applications → Generate Token)

Quick Start

git clone https://github.com/pxsloot/gitea-mcp-server.git && cd gitea-mcp-server
cp .env.example .env              # then edit GITEA_URL and GITEA_TOKEN
uv sync
uv run python -m gitea_mcp_server

Install from git (pip)

pip install git+https://github.com/pxsloot/gitea-mcp-server.git
gitea-mcp

Configuration

Read from source at commit b9b134b62f8eOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add gitea-mcp-server --env GITEA_TOKEN=${GITEA_TOKEN} -- uvx gitea-mcp-server
claude-desktop
{
  "mcpServers": {
    "gitea-mcp-server": {
      "command": "uvx",
      "args": [
        "gitea-mcp-server"
      ],
      "env": {
        "GITEA_TOKEN": "${GITEA_TOKEN}"
      }
    }
  }
}
03

Exposed tools (44)

44 read · 0 write · 0 destructive.

ToolRiskDescription
empty_annotationsreadA tool with null annotations fields
gitea_array_primitives_toolreadA tool
gitea_barreadNo annotations
gitea_bazreadPartial
gitea_doc_toolreadRead a doc
gitea_fooreadSome tool
gitea_free_form_object_toolreadA tool
gitea_issue_listreadList issues
gitea_issue_list_issuesreadList issues in a repository
gitea_known_toolreadA known tool
gitea_repo_listreadList repos
gitea_repo_pull_request_is_mergedreadCheck if a pull request has been merged
gitea_search_toolsreadSearch tools
gitea_testreadA test tool
gitea_test_toolreadTest tool
gitea_tool_array_of_stringsreadA tool returning an array of strings
gitea_tool_concise_envelopereadA tool
gitea_tool_no_schema_includedreadA tool
gitea_tool_with_array_resultreadA tool that returns an array
gitea_tool_with_paginationreadA paginated tool
gitea_tool_with_refsreadA tool
gitea_tool_with_schemareadA tool
gitea_tool_with_string_resultreadA tool that returns a string
gitea_user_get_currentreadGet the authenticated user
hint_toolreadA tool with hints
issue_list_issuesreadAutogen list tool.
minimal_toolread
no_annotationsreadA tool without annotations
read_doc_likereadSynthetic tool with a format-only profile.
synth_fmtreadSynthetic tool.
synth_toolreadSynthetic tool.
synth_valreadSynthetic validation tool.
tread
tagged_toolreadA tool with tags
test_apireadTest API tool
test_calltoolreadTest CallToolResult
test_listreadTest list tool
test_metareadTest meta
test_nowrapreadTest no wrap
test_toolreadA test tool.
tool_areadFirst tool
tool_breadSecond tool
unregisteredreadAn unregistered tool.
with_annotationsreadA tool with annotations
04

Trust audit

SAFEgrade B · trust 85/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (8 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
found

Findings (13)

MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/integration/test_server.py:613
token="test-token-prefix_last8",
LOWInventory / provenance · inv.hidden_file · CWE-1104
.git-blame-ignore-revs
.git-blame-ignore-revs
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_module_imports.py:35
importlib.import_module(module_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_module_imports.py:41
importlib.import_module(mod)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_module_imports.py:66
mod = importlib.import_module(module_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_module_imports.py:105
module = importlib.import_module(module_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_module_imports.py:121
module = importlib.import_module(module_name)
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
gitea_mcp_server/server_setup/spec_loader.py:106
logger.debug("Skipping non-dict token entry", extra={"type": type(token).__name__})
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_regression_316_dotfile_paths.py:144
"path/../../etc",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_validation.py:310
"sub/../../etc",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_validation.py:311
"../../parent",
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
gitea_mcp_server/format.py:669
return base64.b64decode(response.get("content") or "").decode("utf-8")
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
gitea_mcp_server/docs/guides/token-scopes.md:32
**All (public, private, and limited)** -- Full access to everything the user can see. No restrictions on scopes.

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha b9b134b62f8efull audit observations/trust-audit/mcp-server/pxsloot__gitea-mcp-server.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11b9b134b62f8eSAFEB85first audit
06

Questions

What is the gitea-mcp-server MCP server?

Gitea MCP Server – A Model Context Protocol implementation for Gitea. Provides tools and resources for AI agents to interact with Gitea repositories, issues, pull requests, and more, much more. Built with FastMCP for seamless Gitea integration.

What tools does gitea-mcp-server expose?

44 in total: 44 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is gitea-mcp-server safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (85/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does gitea-mcp-server need?

It reads GITEA_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (b9b134b62f8e), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement