5 min read

Serena: IDE-Grade Code Navigation and Editing for AI Agents (GitHub, Scanned)

An MCP server that gives coding agents symbol-level search, refactoring and edits in 40+ languages.

Serena logo
✅
Scan: safe. Nothing malicious. Know that Serena downloads language servers for some languages the first time you use them, and that its pinned Python lockfile carries a number of known advisories. Scanned Oct 26, 2026; the full report is below.

Serena is an MCP server that gives AI coding agents the tools an IDE gives a developer. Instead of reading whole files and editing by line numbers or search and replace, the agent can find a symbol, list a file's outline, find every reference to a function, rename it across the project, or replace a function body by name. It works with Claude Code, Codex, Gemini CLI, OpenCode, Cursor, VS Code and JetBrains assistants, Claude Desktop and other MCP clients.

Under the hood it drives language servers, the same engines that power code intelligence in VS Code, and supports more than 40 languages, from Python, TypeScript, Go, Rust and Java to C#, Kotlin, Swift, Haskell and Lean 4. On large codebases that saves the agent a lot of reading, and fewer tokens spent on finding code means more left for the actual task. It also keeps per-project memories for long-running work.

There is an optional paid JetBrains plugin that swaps the language servers for your JetBrains IDE and adds moves, inlining and type hierarchies; the free language server backend covers find, outline, references, rename and symbol edits. Some languages need their language server or toolchain installed separately, and the README asks you not to install Serena from MCP marketplaces, whose commands are often out of date.

  • Repository: github.com/oraios/serena
  • Licence: custom (Other)
  • Language: Python. Stars: 30.7K. Forks: 2,089. Last push: Oct 26, 2026.
  • Scan: safe, Oct 26, 2026, commit 3ecf6eb

Who it is for

Developers using Claude Code, Codex or another MCP-capable agent on medium to large codebases, who want the agent to navigate and refactor by symbol rather than by text.

Getting started

1. Install with uv (the only prerequisite)

uv tool install -p 3.13 serena-agent

2. Initialise and check the setup

serena init

Then add Serena to your MCP client with the launch command from the clients page of the documentation at oraios.github.io/serena; each client (Claude Code, Codex, Claude Desktop, IDEs) has its own instructions.

Safety scan

We cloned oraios/serena at commit 3ecf6eb on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no committed binaries and no bare-IP URLs across 1,192 files, about 120,000 lines of them Python.
  • Four pattern hits: three curl | sh lines in the Dockerfile, which install nvm, uv and Rust from their official installers when you build the container, and one in src/solidlsp/language_servers/lean4_language_server.py, an error message that tells you how to install the Lean toolchain yourself.
  • Many of the hosts in the code (GitHub releases, NuGet, HashiCorp, Eclipse, JetBrains, the VS Code marketplace) are where Serena fetches language servers for particular languages on first use. Those are third-party binaries running with your permissions.
  • uv.lock pins 213 packages with 87 known advisories (9 critical, 40 high), notably in Pillow, GitPython and anyio. The other 35 sit in the Angular and Svelte test projects under test/resources, which are sample code for tests and never installed.
  • Eight workflows, 23 third-party actions pinned to tags rather than commits, none using pull_request_target. CodeQL enabled, contributing guide and CLA present; no security policy or Dependabot.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious code4 pattern hits found and read; every one is listed under the raw findings.
Install-time code1 npm lifecycle script
Committed binariesNone.
CI workflows8 workflows. None use pull_request_target. 23 of 23 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often github.com, microsoft.github.io, oraios.github.io, www.nuget.org. No URLs to bare IP addresses.
Known vulnerabilities122 advisories across 312 pinned packages: 9 critical, 55 high, 49 moderate, 9 low. test/resources/repos/angular/test_repo/package-lock.json: 8 packages, 15 advisories; test/resources/repos/rust/test_repo/Cargo.lock: 1 packages, 0 advisories; test/resources/repos/rust/test_repo_2024/Cargo.lock: 1 packages, 0 advisories; test/resources/repos/svelte/test_repo/package-lock.json: 90 packages, 20 advisories; uv.lock: 213 packages, 87 advisories.
Project hygieneHas CodeQL, licence file, contributing guide. Missing security policy, automated dependency updates.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Pattern hits (4)
WhereRuleMatch
Dockerfile:30download-piped-to-shellRUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh | bash
Dockerfile:42download-piped-to-shellRUN curl -LsSf https://astral.sh/uv/install.sh | sh
Dockerfile:48download-piped-to-shellRUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
src/solidlsp/language_servers/lean4_language_server.py:38download-piped-to-shell" curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh\n"
npm lifecycle scripts (1)
  • test/resources/repos/svelte/test_repo/package.json prepare: svelte-kit sync || echo ''
Worst known vulnerabilities (24 of 122)
AdvisorySeverityPackageSummary
GHSA-82r6-8w77-94w6criticalanyio@4.13.0AnyIO: TLSStream IDNA 2003 host name encoding enables potential TLS certificate spoofing
GHSA-6q48-6c7w-9gw2criticalcertifi@2026.2.25certifi bundles emSign root CAs with compromised intermediate CA keys
GHSA-284h-m62q-gf8wcriticalgitpython@3.1.58GitPython: Dormant multi-line git-config values are corrupted into live injected directives (e.g. core.hooksPath) on any…
GHSA-332p-7hrc-92wfcriticalpillow@12.3.0Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO
GHSA-5x8w-8jj5-q52hcriticalpillow@12.3.0Pillow: Heap buffer overflow in FlashPix (FPX) JPEG decoding leads to code execution
GHSA-8g5g-8vmr-9782criticalpillow@12.3.0Pillow: Heap buffer overflow in ImagingJpegDecode
GHSA-v9pv-5gc8-w2m6criticalpillow@12.3.0Pillow multi-frame loaders can reuse stale native image storage after mode transitions
GHSA-w889-685w-c8fhcriticalpillow@12.3.0Pillow: Argument Injection in Ghostscript call, potentially leading into RCE
GHSA-ffc3-869f-jxw9criticalpyjwt@2.13.0PyJWT: Asymmetric-PEM detection bypass: whitespace/line-ending-mutated public keys skip the HS/asymmetric confusion guar…
GHSA-39pv-4j6c-2g6vhigh@angular/common@21.2.10@angular/common: Weak 32-Bit Cache Key Hashing in `HttpTransferCache` Leading to Cross-Request Data Leakage and State Po…
GHSA-48r7-hpm6-gfxmhigh@angular/common@21.2.10@angular/common: Denial of Service (DoS) via OOM in Date Formatting (formatDate)
GHSA-jhpw-976m-542jhigh@angular/common@21.2.10Angular: Cache-Key Ambiguity in HttpTransferCache Leading to Cross-Request Response Reuse and State Poisoning
GHSA-p3vc-36g9-x9grhigh@angular/common@21.2.10@angular/common: Denial of Service (DoS) via OOM in Number Formatting (digitsInfo)
GHSA-q6f4-qqrg-jv6xhigh@angular/common@21.2.10@angular/common: Information Leak via Default Caching of Credentialed Requests in HttpTransferCache
GHSA-jj27-h5hq-8x99high@angular/compiler@21.2.10Angular i18n: Cross-Site Scripting (XSS) via event-handler attributes
GHSA-jj27-h5hq-8x99high@angular/core@21.2.10Angular i18n: Cross-Site Scripting (XSS) via event-handler attributes
GHSA-rgjc-h3x7-9mwghigh@angular/core@21.2.10Angular Client Hydration DOM Clobbering & Response-Cache Poisoning
GHSA-j22f-vq7h-c4qmhighdevalue@5.8.1devalue: `stringify`/`uneval` serialize shared memory
GHSA-mcm9-63f2-9j32highdevalue@5.8.1devalue: Repeated primitive strings cause quadratic expansion in uneval
GHSA-r9w8-h9r3-54w4highdevalue@5.8.1devalue: Custom ArrayBuffer revivers can bypass typed-array allocation validation
GHSA-x5rw-q4pp-hg5ghighdevalue@5.8.1devalue: stringifyAsync can cause an unhandled rejection despite a caught returned promise
GHSA-2v37-7h3g-55p8highnanoid@3.3.16nanoid: custom generators can loop indefinitely when size is zero
GHSA-68fv-2mgg-jv7qhighsource-map-js@1.2.1source-map-js allows event-loop denial of service through indexed source-map section offsets
GHSA-587h-7wmj-h5pmhighvite@8.1.5launch-editor: `fs.existsSync()` existence check can be bypassed on Windows

By the numbers

Stars30.7K
Forks2,089
Contributors264
Commits3,584
Open issues68
Open pull requests56
Releases18
Latest releasev2.1.0
Licencecustom
Main languagePython
Project age1 year
Last pushOct 26, 2026
Tracked files1,192
Lines of code148.8K
Checkout size9 MB

Lines by language: Python 120.1K, Markdown 10.8K, YAML 3,502, JavaScript 2,639, CSS 1,974, JSON 1,807.

Questions

Is Serena free?

Yes. The Serena application is GPL-3.0-or-later and its SolidLSP language server layer is MIT, so the installed package as a whole is GPL. The optional JetBrains plugin backend is a paid product with a free trial; the default language server backend costs nothing.

Which AI coding tools work with Serena?

Any MCP client. The documentation covers Claude Code, Codex, Gemini CLI, OpenCode, Claude Desktop, VS Code, Cursor and JetBrains assistants, and it can also run as an HTTP server you point a client at.

Does Serena send my code anywhere?

Serena itself works locally: it runs language servers on your machine and returns results to your agent. Your code reaches a model only through the agent you connect it to, under that agent's own terms.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.