🌐
GitHub
github.com › astral-sh › ruff-lsp
GitHub - astral-sh/ruff-lsp: A Language Server Protocol implementation for Ruff. · GitHub
A Language Server Protocol implementation for Ruff, an extremely fast Python linter and code formatter, written in Rust.
Starred by 1.5K users
Forked by 49 users
Languages   Python 99.5% | Just 0.5%
🌐
GitHub
github.com › astral-sh › ruff-vscode
GitHub - astral-sh/ruff-vscode: A Visual Studio Code extension with support for the Ruff linter. · GitHub
The extension has support for Jupyter ... capabilities of the Language Server Protocol which were added in 3.17. This has been implemented in ruff-lsp as of version v0.0.43 which provides full support for all of the existing capabilities available to Python files in Jupyter Notebooks, ...
Starred by 1.6K users
Forked by 73 users
Languages   TypeScript 57.8% | Python 38.7% | JavaScript 2.3% | Just 1.2%
Discussions

Ruff v0.4.5: Ruff's language server is now in beta!
I sometimes work in some pretty big python code bases and you can really feel pyright shrugging through all files in real time. I wonder if there are any gains there More on reddit.com
🌐 r/neovim
52
155
May 23, 2024
python - Configure Visual Studio Code using settings.json to use Ruff instead of Pylint, Pylance, etc - Stack Overflow
I believe Pylance could be also uninstalled, but for now I am still evaluating benefits of using Ruff language server vs. Pylance. Note: My answer is based on that I was facing an identical challenge, and this is what I ended up with as a "good working configuration" for Python development ... More on stackoverflow.com
🌐 stackoverflow.com
What are the best linters and language servers for python?
Also consider basedpyright, which is a fork of pyright where they try to achieve feature parity with pylance More on reddit.com
🌐 r/Python
60
107
March 11, 2025
Python language servers revisited
Back in December 2022, I posted: I’m posting again with more or less the same question, because I recently upgraded my neovim config (which was just using ruff and pydocstyle), and in that process neovim (lunarvim, actually) switched me back to pyright. Fortunately, I was exploring that on ... More on discuss.python.org
🌐 discuss.python.org
3
0
February 24, 2024
🌐
GitHub
github.com › python-lsp › python-lsp-ruff
GitHub - python-lsp/python-lsp-ruff: Linter plugin for pylsp based on ruff. · GitHub
python-lsp-ruff is a plugin for python-lsp-server that adds linting, code actions and formatting capabilities that are provided by ruff, an extremely fast Python linter and formatter written in Rust.
Starred by 218 users
Forked by 24 users
Languages   Python
🌐
Astral
docs.astral.sh › ruff › editors › setup
Setup | Ruff
Otherwise, if you already have language-servers defined, you can simply add "ruff" to the list. For example, if you already have pylsp as a language server, you can modify the language entry as follows: [[language]] name = "python" language-servers = ["ruff", "pylsp"]
🌐
Reddit
reddit.com › r/neovim › ruff v0.4.5: ruff's language server is now in beta!
r/neovim on Reddit: Ruff v0.4.5: Ruff's language server is now in beta!
May 23, 2024 -

Ruff Server is now in beta! In case you didn't know, ruff server is an lsp for python that is also a rewrite of ruff-lsp in rust which was originally written in python I believe. What excites me the most about their blog post regarding the new release is the last bullet point...

Supporting more general language server features: We plan to expand the server's capabilities beyond linting, formatting, and diagnostics.

I hope this means that we might see a highly performant, high quality alternative to the other python lsps.

Update:

Forgot links somehow -_- blogpost: https://astral.sh/blog/ruff-v0.4.5 github: https://github.com/astral-sh/ruff/tree/main/crates/ruff_server#setup

🌐
Astral
astral.sh › blog › ruff-v0.4.5
Ruff v0.4.5: Ruff's language server is now written in Rust
May 22, 2024 - Ruff is an extremely fast Python linter and formatter, written in Rust. Ruff can be used to replace Black, Flake8 (plus dozens of plugins), isort, pydocstyle, pyupgrade, and more, all while executing tens or hundreds of times faster than any ...
🌐
Medium
jack-hodkinson.medium.com › integrating-the-ruff-language-server-4f6b0d126ebd
Integrating the ruff language server | by Jack Hodkinson | Medium
July 15, 2024 - Ruff is a python code formatter and linter. You can use it as a drop-in replacement for black for code formatting. You can pip install it and run it from the command line via ruff format example.py.
🌐
Astral
docs.astral.sh › ruff › editors › features
Features | Ruff
Similar to Ruff's CLI, the Ruff Language Server fully supports Jupyter Notebook files with all the capabilities available to Python files.
Find elsewhere
🌐
PyPI
pypi.org › project › ruff-lsp
ruff-lsp · PyPI
A Language Server Protocol implementation for Ruff.
      » pip install ruff-lsp
    
Published   Feb 10, 2025
Version   0.0.62
🌐
GitHub
github.com › python-lsp › python-lsp-server
GitHub - python-lsp/python-lsp-server: Fork of the python-language-server project, maintained by the Spyder IDE team and the community · GitHub
Installing these plugins will add extra functionality to the language server: pylsp-mypy: MyPy type checking for Python >=3.8. python-lsp-isort: code formatting using isort (automatic import sorting). python-lsp-black: code formatting using Black. pyls-memestra: detecting the use of deprecated APIs. pylsp-rope: Extended refactoring capabilities using Rope. python-lsp-ruff: Extensive and fast linting using ruff.
Starred by 2.5K users
Forked by 234 users
Languages   Python 99.9% | Shell 0.1%
🌐
Marimo
docs.marimo.io › guides › editor_features › language_server
Language Server Protocol (LSP)
The core Python language server providing completions, hover, go-to-definition, diagnostics, code actions, rename, and signature help. ... pip install "marimo[lsp]" # or uv add "marimo[lsp]" # or conda install -c conda-forge python-lsp-server python-lsp-ruff
Top answer
1 of 1
4

I was in the similar situation, and I had this configuration in the Visual Studio Code's settings.json for Python:

{
//...
"[python]": {
    "editor.formatOnSaveMode": "file",
    "editor.formatOnType": false,
    // For formatting with YAPF install extension: https://marketplace.visualstudio.com/items?itemName=eeyore.yapf
    // Then use 'eeyore.yapf' as below for editor.defaultFormatter:
    "editor.defaultFormatter": "eeyore.yapf"
  },
/...
}

In addition to the above configuration, I had been using following Visual Studio Code extensions installed:

  1. Python by Microsoft
  2. Pylance by Microsoft, note that this one is installed automatically with (1)
  3. Python Debugger by Microsoft, note that this one is installed automatically with (1)
  4. isort by Microsoft
  5. Flake8 by Microsoft
  6. Pylint by Microsoft
  7. yapf by EeyoreLee

After I decided to try Ruff (via the Visual Studio Code extension) for both linting and formatting, I ended up with these configurations and extensions:

  1. Visual Studio Code settings.json file

     //...
     // Python language environment
     "[python]": {
       "editor.formatOnSaveMode": "file",
       "editor.formatOnType": false,
       // For formatting with YAPF install extension: https://marketplace.visualstudio.com/items?itemName=eeyore.yapf
       // Then use 'eeyore.yapf' as below for editor.defaultFormatter:
       // "editor.defaultFormatter": "eeyore.yapf",
       // For formatting with Ruff install extension: https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff
       // Then use 'charliermarsh.ruff' as below for editor.defaultFormatter:
       "editor.formatOnSave": true,
       "editor.codeActionsOnSave": {
         "source.fixAll": "explicit",
         "source.organizeImports": "explicit"
       },
       "editor.defaultFormatter": "charliermarsh.ruff",
     },
     "ruff.nativeServer": "on",
    
     // Python Language Server
     //"python.languageServer": "Pylance",
    
     // Pylint extension: https://marketplace.visualstudio.com/items?itemName=ms-python.pylint
     // "pylint.enabled": true,
     // "pylint.lintOnChange": true,
     // "pylint.path" : ["${interpreter}", "-m", "pylint"],
     // "pylint.interpreter": [], // Defaults to extension using the path to the selected Python interpreter
    
     // Flake8 extension: https://marketplace.visualstudio.com/items?itemName=ms-python.flake8
     // "flake8.args": [
     //   "--verbose",
     //   "--max-line-length",
     //   "160",
     //   "--max-complexity",
     //   "10",
     //   "--ignore=E266,E501,C901"
     // ],
     // "flake8.severity": { "convention": "Information", "error": "Error", "fatal": "Error", "refactor": "Hint", "warning": "Warning", "info": "Information" },
     //...
    
  2. For each project individually, creating .ruff.toml to further configure Ruff behavior and enable/disable rules from other tools implemented in Ruff:

    Copytarget-version = "py313"
    line-length = 160
    indent-width = 2
    extend-exclude = [".vscode", ".idea", "__pycache__", ".python-version", ".ruff.toml", "ruff.toml", "setup.cfg", "pyproject.toml"]
    
    [format]
    indent-style = "space"
    line-ending = "lf"
    docstring-code-format = true
    docstring-code-line-length = 120
    
    [lint]
    # D - Enable all `pydocstyle` rules, limiting to those that adhere to the Pep257 convention enabled via `convention = "pep257"` below
    select = ["E501", "I", "D"]
    ignore = ["D203","D204","D211","D212","D400","D406","D407","E266","C901"]
    
    [lint.pylint]
    # Maximum number of arguments for function / method
    max-args = 20
    # Maximum number of boolean expressions in a if statement
    max-bool-expr = 10
    # Maximum number of branch for function / method body
    max-branches = 100
    # Maximum number of locals for function / method body
    max-locals = 15
    # Maximum number of nested blocks for function / method body
    max-nested-blocks = 5
    # Maximum number of positional arguments allowed for a function or method definition
    max-positional-args = 10
    # Maximum number of public methods for a class (see R0904).
    max-public-methods = 30
    # Maximum number of return statements allowed for a function or method body
    max-returns = 10
    # Maximum number of statements in function / method body
    max-statements = 1000
    
    [lint.pydocstyle]
    convention = "pep257"
    
    [lint.mccabe]
    max-complexity = 10
    
  3. I uninstalled all Visual Studio Code extensions [4-7] in the above list. I believe Pylance could be also uninstalled, but for now I am still evaluating benefits of using Ruff language server vs. Pylance.

Note: My answer is based on that I was facing an identical challenge, and this is what I ended up with as a "good working configuration" for Python development in Visual Studio Code. The driving idea is to reduce number of plugins in Visual Studio Code for each individual tool, since Ruff covers many of the rules from other tools natively.

🌐
Package Control
packagecontrol.io › packages › LSP-ruff
LSP-ruff - Packages - Package Control
LSP helper for ruff - an extremely fast Python linter, written in Rust.
🌐
PyPI
pypi.org › project › python-lsp-server
python-lsp-server · PyPI
Installing these plugins will add extra functionality to the language server: pylsp-mypy: MyPy type checking for Python >=3.8. python-lsp-isort: code formatting using isort (automatic import sorting). python-lsp-black: code formatting using Black. pyls-memestra: detecting the use of deprecated APIs. pylsp-rope: Extended refactoring capabilities using Rope. python-lsp-ruff: Extensive and fast linting using ruff.
      » pip install python-lsp-server
    
Published   Dec 06, 2025
Version   1.14.0
🌐
Zed
zed.dev › docs › languages › python
Python | Python
Zed provides several Python language servers out of the box. By default, basedpyright is the primary language server, and Ruff is used for formatting and linting.
🌐
Reddit
reddit.com › r/python › what are the best linters and language servers for python?
r/Python on Reddit: What are the best linters and language servers for python?
March 11, 2025 -

All of the different language servers, linters, and formatters available for Python can be very confusing. There is significant overlap between tools and it's hard to know what is what- this is my attempt to sort through it all.

Below is what I have been able to figure out, corrections and additions added as I see them from the comments.

Ruff is a fast linter / code formatter. It has overtaken Black and Flake8 as the best / most popular linter although not as thourough as Pylint. Rust.

JEDI is a static analysis tool that supports autocompletion, goto, and refactoring. It works with several langauge servers. Similar functionality to Pyright. Python.

Pyright is a language server maintained by Microsoft. It supports type checking (primary function), goto, autocomplete, similar to JEDI. It is written in TypeScript. Pylance is a Microsoft product that builds on Pyright and adds additional feataures to VS Code. TypeScript.

Basedpyright is a fork of Pyright to add Pylance functionality to Pyright for non-Microsoft editors. Mostly TypeScript with Python additions.

MyPy is one of the original static type checkers (2012, but still actively maintained). Python.

PyLSP/Python LSP Server is a language server implementation that interfaces with other libraries like JEDI to provide various LSP functionality. Python.

Pylint is a static code analyser and very thorough (and slow) linter. It can be used alongside other analysis tools like Ruff or Black, and mypy or pyright. Python.

In addition to the above, some commercial IDEs like PyCharm use their own proprietary linters and type checkers.

I use the Helix editor and by default it will use Ruff, JEDI, and pylsp together. I was confused why it used more than one language server/library, which was the motivation for looking into all of this.

🌐
Astral
docs.astral.sh › ruff › editors › settings
Settings | Ruff
The Ruff Language Server provides a set of configuration options to customize its behavior along with the ability to use an existing pyproject.toml or ruff.toml file to configure the linter and formatter. This is done by providing these settings while initializing the server.
🌐
Astral
docs.astral.sh › ruff › editors › migration
Migrating from ruff-lsp | Ruff
ruff-lsp is the Language Server Protocol implementation for Ruff to power the editor integrations. It is written in Python and is a separate package from Ruff itself. The native server, however, is the Language Server Protocol implementation which is written in Rust and is available under the ...
🌐
GitHub
github.com › astral-sh › ruff › blob › main › crates › ruff_server › README.md
ruff/crates/ruff_server/README.md at main · astral-sh/ruff
An extremely fast Python linter and code formatter, written in Rust. - ruff/crates/ruff_server/README.md at main · astral-sh/ruff
Author   astral-sh
🌐
Python.org
discuss.python.org › python help
Python language servers revisited - Python Help - Discussions on Python.org
February 24, 2024 - Back in December 2022, I posted: I’m posting again with more or less the same question, because I recently upgraded my neovim config (which was just using ruff and pydocstyle), and in that process neovim (lunarvim, act…