Skip to main content

Cfn Lsp Extra

Python Version PyPI codecov

[!NOTE] There is no support for Python 3.14 yet due to incompatibilities with SAM

An experimental cloudformation language server (with support for SAM templates) built on top of cfn-lint and the Cloudformation user guide, aiming to provide hovering, completion, etc. YAML and JSON are supported, though YAML has more features currently implemented (for example snippets) and will give a better experience. Trust me.

https://user-images.githubusercontent.com/17688577/176939586-df1d9ed8-5ec6-46d5-9f26-7222644047bd.mp4

Features

Method Status
textDocument/hover Done for resources (in particular, required properties for a resource will be auto-expanded), resource properties, subproperties, !Refs and intrinsic functions.
textDocument/completion Done for resources, resource properties, subproperties, property values (for enums), refs, !GetAtts and intrinsic functions. TODO Fn::GetAtt.
textDocument/definition Done for !Refs and !GetAtts. TODO mappings.
textDocument/publishDiagnostics Done through cfnlint.

Also checkout the changelog.

Installation

First install the executable, pipx is recommended, but you can use pip instead if you like to live dangerously:

pipx install cfn-lsp-extra

Or get the bleeding edge from source:

pipx install git+https://github.com/laurencewarne/cfn-lsp-extra.git@$(git ls-remote git@github.com:laurencewarne/cfn-lsp-extra.git | head -1 | cut -f1)

Or from a local repository:

cd cfn-lsp-extra/
pipx install . --force  # Or pipx install '.[parse]' --force

Updating:

pipx upgrade cfn-lsp-extra

Keeping cfnlint Up to Date

Updates to cfn-lsp-extra typically lag behind cfnlint which it uses for diagnostics, which can become an irritation when it leads diagnostics from cfn-lsp-extra becoming outdated and new desirable lint rules not showing. Assuming you installed cfnlint using pipx, you can use:

alias cfn-lsp-extra='env PYTHONPATH=$HOME/.local/pipx/venvs/cfn-lint/lib/python<PYTHON_VERSION>/site-packages/ cfn-lsp-extra'

To ensure cfn-lsp-extra uses your system cfnlint version. Note This comes with some risk with respect to clashing dependencies, but I would expect it to generally work as long as cfnlint and cfn-lsp-extra aren't wildly out of date.

Emacs

Install the lsp-cfn.el package.

Neovim

Make sure you're running at least 0.8, then add the following in ~/.config/nvim/filetype.lua:

vim.filetype.add {
  pattern = {
    ['.*'] = {
      priority = math.huge,
      function(path, bufnr)
        local line1 = vim.api.nvim_buf_get_lines(bufnr, 0, 1, false)[1] or ""
        local line2 = vim.api.nvim_buf_get_lines(bufnr, 1, 2, false)[1] or ""
        if vim.regex([[^AWSTemplateFormatVersion]]):match_str(line1) ~= nil or
           vim.regex([[AWS::Serverless-2016-10-31]]):match_str(line1) ~= nil then
          return 'yaml.cloudformation'
        elseif vim.regex([[["']AWSTemplateFormatVersion]]):match_str(line1) ~= nil or
           vim.regex([[["']AWSTemplateFormatVersion]]):match_str(line2) ~= nil or
           vim.regex([[AWS::Serverless-2016-10-31]]):match_str(line1) ~= nil or
           vim.regex([[AWS::Serverless-2016-10-31]]):match_str(line2) ~= nil then
          return 'json.cloudformation'
        end
      end,
    },
  },
}

Then you can use one of:

  1. Neovim's built-in LSP client (requires 0.11.0 or greater):
vim.lsp.config("cfn-lsp-extra", {
  cmd = { os.getenv("HOME") .. '/.local/bin/cfn-lsp-extra' },
  filetypes = { 'yaml.cloudformation', 'json.cloudformation' },
  root_markers = { '.git' },
  settings = {
    documentFormatting = false,
  },
})
vim.lsp.enable("cfn-lsp-extra")
  1. nvim-lspconfig, which is required for neovim below version 0.11.0:
require('lspconfig.configs').cfn_lsp = {
  default_config = {
    cmd = { os.getenv("HOME") .. '/.local/bin/cfn-lsp-extra' },
    filetypes = { 'yaml.cloudformation', 'json.cloudformation' },
    root_dir = function(fname)
      return require('lspconfig').util.find_git_ancestor(fname) or vim.fn.getcwd()
    end,
    settings = {
      documentFormatting = false,
    },
  },
}
require('lspconfig').cfn_lsp.setup{}
  1. LanguageClient-neovim:
let g:LanguageClient_serverCommands = {
    \ 'yaml.cloudformation': ['~/.local/bin/cfn-lsp-extra'],
    \ 'json.cloudformation': ['~/.local/bin/cfn-lsp-extra']
    \ }

Patches documenting integration for other editors are very welcome!

Development

cfn-lsp-extra uses uv for virtualenv and general project management.

Common commands:

uv run pytest                    # unit tests
uv run pytest --run-integration  # integration tests
uv run ruff check                # flake8 lints
uv run mypy cfn_lsp_extra/       # mypy checks

Alternatives

vscode-cfn-lint

cfn-lint

Note this is used by cfn-lsp-extra under the hood to generate diagnostics. One difference with cfn-lsp-extra is that diagnostics will be refreshed every time you make a change to the document, in other words you don't need to save the file.

yamlls

You can use yamlls in conjunction with the Cloudformation schema at https://www.schemastore.org/json/ as an alternative. For Emacs, lsp-mode can install yamlls for you, from there you could do something like:

(defun my-yamlls-cloudformation-setup ()
  ;; There's also one for serverless
  (lsp-yaml-set-buffer-schema "https://raw.githubusercontent.com/awslabs/goformation/master/schema/cloudformation.schema.json")
  (setq-local
   lsp-yaml-custom-tags
   ["!And"
    "!Base64"
    "!Cidr"
    "!Equals"
    "!FindInMap sequence"
    "!GetAZs"
    "!GetAtt"
    "!If"
    "!ImportValue"
    "!Join sequence"
    "!Not"
    "!Or"
    "!Ref Scalar"
    "!Ref"
    "!Select"
    "!Split"
    "!Sub"
    "!fn"]))

;; Using the mode defined by https://www.emacswiki.org/emacs/CfnLint
(add-hook 'cfn-yaml-mode-hook #'my-yamlls-cloudformation-setup)
(add-hook 'cfn-yaml-mode-hook #'lsp-deferred)

This will give you completions (and some support for value completions?), though no hover documentation.

Metadata

Release files for cfn-lsp-extra 0.7.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cfn-lsp-extra 0.7.5
File Size Uploaded Provenance Actions
cfn_lsp_extra-0.7.5.tar.gz 3.4 MB With provenance Details for cfn_lsp_extra-0.7.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for cfn-lsp-extra 0.7.5
File Interpreter ABI Platform Actions
cfn_lsp_extra-0.7.5-py3-none-any.whl Python 3 none any Details for cfn_lsp_extra-0.7.5-py3-none-any.whl

Total release size: 6.7 MB

Release files / cfn_lsp_extra-0.7.5.tar.gz

Download URL cfn_lsp_extra-0.7.5.tar.gz
Size 3.4 MB
Tags Source
SHA-256 checksum
How to use checksums
2ac711a75f55c0e1aaa93e4c89d449109bb762f0c85b1563182c9657c119da67
BLAKE2b-256 checksum
How to use checksums
20367947683ebd7816272c80c4a47a6cc17b8f6cf9f4eb0bfc94d346e0562833
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 2, 2026.

Transparency log

Release files / cfn_lsp_extra-0.7.5-py3-none-any.whl

Download URL cfn_lsp_extra-0.7.5-py3-none-any.whl
Size 3.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
f204d8ead7e15aa74a6a5d9a7b3627c5ea02dde9ff9406658a485e0201026bec
BLAKE2b-256 checksum
How to use checksums
8fafc598460a3cd6d1c5beb15974a07f7c219c11e712fe8698c0f830d00650bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 2, 2026.

Transparency log

Security for cfn-lsp-extra 0.7.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for cfn_lsp_extra-0.7.5.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page