MFEM is a general, modular, parallel C++ library for finite element methods research and development. Conceptually, MFEM can be viewed as a finite element toolbox, that provides the building blocks for developing finite element algorithms in a manner similar to that of MATLAB for linear algebra methods. In particular, MFEM supports a wide variety of finite element spaces in 2D and 3D, including arbitrary high-order H1-conforming, discontinuous (L2), H(div)-conforming, H(curl)-conforming and NURBS elements, as well as many bilinear and linear forms defined on them. It includes classes for dealing with various types of triangular, quadrilateral, tetrahedral and hexahedral meshes and their global and, in the case of triangular and tetrahedral meshes, local refinement (including in parallel). General element transformations, allowing for elements with curved boundaries are also supported. MFEM is commonly used as a ”finite element to linear algebra translator”, since it can take a problem described in terms of finite element-type objects, and produce the corresponding linear algebra vectors and sparse matrices. In order to facilitate this, MFEM uses compressed sparse row (CSR) sparse matrix storage and includes simple smoothers and Krylov solvers, such as PCG, GMRES and BiCGStab. The MPI-based parallel version of MFEM can be used as a scalable unstructured finite element problem generator, which supports parallel local refinement and parallel curved meshes, as well as several solvers from the hypre library. An experimental support for OpenMP acceleration is also included as of version 2.0. MFEM originates from the previous research effort in the (unreleased) AggieFEM/aFEM project. Some examples of its use can be found in the Gallery and Publications pages. We recommend using it together with GLVis, which is an OpenGL visualization tool build on top of MFEM.