Skip to main content
Glama
clearskies MCP Server

clearskies MCP Server

clearskies MCP Server

An MCP (Model Context Protocol) server for the clearskies Python framework. This server provides AI assistants with tools for code generation, documentation, and project scaffolding when building applications with clearskies.

Installation

pip install clear-skies-mcp-server

Or with uv:

uv pip install clear-skies-mcp-server

Related MCP server: Vibe Coder MCP Server

Features

Documentation Tools

Core Type Discovery

Tool

Description

list_available_columns

List all available clearskies column types

list_available_endpoints

List all available endpoint types

list_available_backends

List all available backend types

list_available_contexts

List all available context types

get_column_info

Get detailed docs for a specific column type

get_endpoint_info

Get detailed docs for a specific endpoint type

get_backend_info

Get detailed docs for a specific backend type

get_context_info

Get detailed docs for a specific context type

Extended Type Discovery

Tool

Description

list_available_authentication

List all authentication types (SecretBearer, JWKS, etc.)

list_available_validators

List all validator types (Required, Unique, etc.)

list_available_exceptions

List all exception types

list_available_di_inject

List all DI inject helpers

list_available_cursors

List all cursor types

list_available_input_outputs

List all input/output handlers

list_available_configs

List all configuration types

list_available_clients

List all client types

list_available_secrets

List all secrets handlers

list_available_security_headers

List all security header handlers

list_available_query

List all query builder types

list_available_query_results

List all query result types

list_available_functional

List all functional utilities

Extended Type Info

Tool

Description

get_authentication_info

Get detailed docs for a specific authentication type

get_validator_info

Get detailed docs for a specific validator type

get_exception_info

Get detailed docs for a specific exception type

get_di_inject_info

Get detailed docs for a specific DI inject helper

get_cursor_info

Get detailed docs for a specific cursor type

get_input_output_info

Get detailed docs for a specific input/output handler

get_config_info

Get detailed docs for a specific configuration type

get_client_info

Get detailed docs for a specific client type

get_secret_info

Get detailed docs for a specific secrets handler

get_security_header_info

Get detailed docs for a specific security header handler

get_query_info

Get detailed docs for a specific query builder type

get_query_result_info

Get detailed docs for a specific query result type

get_functional_info

Get detailed docs for a specific functional utility

Concept Explanation

Tool

Description

explain_concept

Explain any clearskies concept in detail

Code Generation Tools

Tool

Description

generate_model

Generate a clearskies Model class definition

generate_endpoint

Generate an endpoint configuration

generate_context

Generate a context wrapping an endpoint

generate_endpoint_group

Generate an endpoint group configuration

Scaffolding Tools

Tool

Description

scaffold_project

Generate a complete clearskies project with multiple models

scaffold_restful_api

Generate a complete REST API application for a single model

generate_model_with_relationships

Generate multiple related models with relationships

Documentation Resources

Core Documentation

Resource URI

Description

clearskies://docs/overview

Framework overview

clearskies://docs/models

Model documentation

clearskies://docs/endpoints

Endpoint documentation

clearskies://docs/columns

Column types documentation

clearskies://docs/backends

Backend documentation

clearskies://docs/contexts

Context documentation

clearskies://docs/di

Dependency injection docs

clearskies://docs/authentication

Authentication docs

clearskies://docs/save-lifecycle

Save lifecycle docs

clearskies://docs/queries

Query documentation

clearskies://docs/validators

Validator documentation

Extended Documentation

Resource URI

Description

clearskies://docs/testing

Testing clearskies applications

clearskies://docs/authorization

Authorization patterns

clearskies://docs/error-handling

Error handling

clearskies://docs/input-handling

Input handling

clearskies://docs/endpoint-groups

Endpoint groups

clearskies://docs/routing

Routing documentation

clearskies://docs/responses

Response customization

clearskies://docs/migrations

Database migrations (Mygrations)

clearskies://docs/advanced-columns

Advanced column types

clearskies://docs/advanced-queries

Advanced query patterns

clearskies://docs/configuration

Configuration management

clearskies://docs/logging

Logging and observability

clearskies://docs/caching

Caching patterns

clearskies://docs/async

Async patterns

clearskies://docs/state-machine-advanced

Advanced state machine patterns

clearskies://docs/secrets-backend

Secrets backend

Backend Deep Dives

Resource URI

Description

clearskies://docs/backend-memory

MemoryBackend deep dive

clearskies://docs/backend-cursor

CursorBackend deep dive

clearskies://docs/cursors

Cursors and raw SQL

clearskies://docs/transactions

Transaction management

Framework Internals

Resource URI

Description

clearskies://docs/di-advanced

Advanced DI patterns

clearskies://docs/query-execution

Query execution model

clearskies://docs/model-lifecycle

Model lifecycle

clearskies://docs/input-output

Input/output system

Developer Experience

Resource URI

Description

clearskies://docs/troubleshooting

Troubleshooting guide

clearskies://docs/best-practices

Best practices

clearskies://docs/exceptions

Exception hierarchy reference

clearskies://docs/auth-flow

Auth flow documentation

Reference Material

Resource URI

Description

clearskies://docs/column-reference

Complete column parameter reference

clearskies://docs/endpoint-reference

Complete endpoint parameter reference

clearskies://docs/performance

Performance guide

clearskies://docs/patterns

Common patterns cookbook

Example Resources

Resource URI

Description

clearskies://examples/restful-api

Complete REST API example

clearskies://examples/relationships

Model relationships example

clearskies://examples/authentication

Authenticated API example

clearskies://examples/cli-app

CLI application example

clearskies://examples/api-backend

API client (ApiBackend) example

clearskies://examples/testing

Testing example

clearskies://examples/authorization

Authorization patterns example

clearskies://examples/error-handling

Error handling example

clearskies://examples/endpoint-group

Endpoint groups example

clearskies://examples/migrations

Database migrations example

clearskies://examples/hierarchical-data

Hierarchical data (CategoryTree) example

clearskies://examples/audit-trail

Audit trail tracking example

clearskies://examples/pivot-data

Many-to-many with pivot data example

clearskies://examples/advanced-queries

Advanced query patterns example

clearskies://examples/configuration

Configuration management example

clearskies://examples/state-machine-advanced

Advanced state machine example

clearskies://examples/secrets-backend

Secrets backend example

Module Resources

Resource URI

Description

clearskies://modules/overview

Overview of all extension modules

clearskies://modules/aws

clearskies-aws module

clearskies://modules/graphql

clearskies-graphql module

clearskies://modules/gitlab

clearskies-gitlab module

clearskies://modules/cortex

clearskies-cortex module

clearskies://modules/snyk

clearskies-snyk module

clearskies://modules/akeyless

clearskies-akeyless-custom-producer module

Style Resources

Resource URI

Description

clearskies://style/docstrings

Docstring style guide

MCP Configuration

Add this to your MCP settings (e.g. in Kilo Code, Claude Desktop, etc.):

{
    "mcpServers": {
        "clearskies": {
            "command": "clear-skies-mcp-server",
            "args": []
        }
    }
}

Or if using uv/uvx:

{
    "mcpServers": {
        "clearskies": {
            "command": "uvx",
            "args": ["clear-skies-mcp-server"]
        }
    }
}

Development

# Clone the repo
git clone https://github.com/clearskies-py/mcp-server.git
cd mcp-server

# Create venv and install dependencies
uv sync all-extras --all-groups

# Run the server
clear-skies-mcp-server

License

MIT

Available Tools

54 tools
analyze_v1_projectA
Analyze a ClearSkies v1 project and generate migration report.

Args:
    project_path: Path to the v1 project directory

Returns:
    Dictionary containing:
    - models: List of discovered models
    - handlers: List of discovered handlers
    - errors: List of parsing errors
    - warnings: List of migration warnings
    - complexity: Migration complexity assessment

Inputs: project_path (required). Returns: object

check_module_compatibilityC

Check if a module is installed and compatible.

Args:
    module_name: The module name to check

Inputs: module_name (required). Returns: result

explain_conceptA

Explain a clearskies framework concept in detail.

Args:
    concept: The concept to explain. One of: model, endpoint, backend, column, context, di,
             authentication, autodoc, query, validator, schema, save_lifecycle, state_machine,
             declarative_programming, infrastructure_neutral, testing, authorization, error_handling,
             input_handling, endpoint_groups, routing, responses, migrations, advanced_columns,
             advanced_queries, configuration, logging, caching, async, state_machine_advanced,
             secrets_backend.

Inputs: concept (required). Returns: result

explain_moduleA

Get usage examples and integration guidance for a specific clearskies extension module.

Args:
    module_name: The module name (e.g. "clearskies-aws", "clearskies-graphql", "clearskies-snyk",
                 "clearskies-gitlab", "clearskies-cortex", "clearskies-akeyless-custom-producer").

Inputs: module_name (required). Returns: result

explain_v1_v2_differenceA
Explain how a specific concept changed between v1 and v2.

Args:
    concept: The concept to explain. Options:
        - 'model': Model definition changes
        - 'handler': Handler → Endpoint changes
        - 'di': Dependency injection changes
        - 'columns': Column definition changes
        - 'application': Application → Context changes
        - 'backend': Backend configuration changes
        - 'type_hints': Type hint requirements

Returns:
    Detailed explanation of the changes

Inputs: concept (required). Returns: result

generate_contextA

Generate a clearskies context configuration that wraps an endpoint.

Args:
    context_type: The context type (e.g. "Cli", "WsgiRef", "Wsgi").
    endpoint_code: The endpoint expression to wrap (e.g. output from generate_endpoint).
    classes: List of model class names to register with DI.
    modules: List of module names to register with DI.
    bindings: Dictionary of name → value DI bindings.

Inputs: context_type (required), endpoint_code (required), classes, modules, +1 more. Returns: result

generate_endpointB

Generate a clearskies endpoint configuration.

Args:
    endpoint_type: Type of endpoint (e.g. "RestfulApi", "List", "Create", "Get", "Update", "Delete", "Callable").
    model_name: The model class name to use with this endpoint.
    url: The URL path for the endpoint (optional).
    readable_column_names: List of column names that are returned in the response.
    writeable_column_names: List of column names the client can set.
    sortable_column_names: List of column names the client can sort by.
    searchable_column_names: List of column names the client can search by.
    default_sort_column_name: The default column to sort by.
    authentication: Authentication configuration (e.g. 'clearskies.authentication.SecretBearer(environment_key="MY_SECRET")').
    extra_options: Additional keyword arguments for the endpoint constructor.

Inputs: model_name (required), endpoint_type (required), url, extra_options, +6 more. Returns: result

generate_endpoint_groupA

Generate a clearskies EndpointGroup configuration.

Args:
    url: The URL prefix for all endpoints in the group.
    endpoints: List of endpoint configurations. Each dict has:
        - type (str): Endpoint type (e.g. "RestfulApi", "Callable", "List")
        - model_name (str): Model class name (for model-based endpoints)
        - url (str): URL path for this endpoint
        - readable_column_names (list[str], optional): Readable columns
        - writeable_column_names (list[str], optional): Writeable columns
        - sortable_column_names (list[str], optional): Sortable columns
        - searchable_column_names (list[str], optional): Searchable columns
        - default_sort_column_name (str, optional): Default sort column
        - request_methods (list[str], optional): Allowed HTTP methods (for Callable)
        - extra_options (dict, optional): Additional endpoint options
    authentication: Authentication configuration for all endpoints in the group
        (e.g. 'clearskies.authentication.SecretBearer(environment_key="MY_SECRET")').

Inputs: url, endpoints, authentication. Returns: result

generate_modelA

Generate a clearskies Model class definition.

Args:
    name: The model class name in PascalCase (e.g. "User", "OrderProduct").
    columns: List of column definitions. Each dict has:
        - name (str): Column name
        - type (str): Column type (e.g. "String", "Integer", "Uuid", "BelongsToId")
        - options (dict, optional): Keyword arguments for the column constructor
    backend_type: Backend class name (default: "MemoryBackend").
    backend_options: Keyword arguments for the backend constructor.
    id_column_name: The name of the id column (default: "id").
    hooks: Optional list of hook methods to include stubs for (e.g. ["pre_save", "post_save", "save_finished"]).

Inputs: name (required), columns (required), hooks, backend_type, +2 more. Returns: result

generate_model_with_relationshipsA

Generate multiple related clearskies Model classes with their relationships properly configured.

Use this when you need to create models with BelongsTo, HasMany, or ManyToMany relationships.

Args:
    models: List of model definitions. Each dict has:
        - name (str): Model class name
        - columns (list[dict]): Column definitions
        - backend_type (str, optional): Backend type
        - id_column_name (str, optional): Id column name

Inputs: models (required). Returns: result

generate_v2_migrationA
Generate v2 code from a v1 project.

This tool analyzes a v1 codebase and generates v2-compatible code.
Use dry_run=True to preview changes without writing files.

Args:
    project_path: Path to the v1 project directory
    output_path: Path where v2 code should be generated
    dry_run: If True, don't write files (default: True)

Returns:
    Dictionary containing:
    - files: List of files to create/modify
    - breaking_changes: List of breaking changes
    - warnings: List of warnings
    - manual_steps: List of manual steps required

Inputs: output_path (required), project_path (required), dry_run. Returns: object

get_authentication_infoA

Get detailed documentation for a specific clearskies authentication type.

Args:
    auth_type: The auth type name (e.g. "SecretBearer", "JWKS", "SecretBasic").

Inputs: auth_type (required). Returns: result

get_backend_infoA

Get detailed documentation for a specific clearskies backend type.

Args:
    backend_type: The name of the backend type (e.g. "MemoryBackend", "CursorBackend", "ApiBackend").

Inputs: backend_type (required). Returns: result

get_client_infoC

Get detailed documentation for a specific clearskies client type.

Args:
    client_type: The client type name.

Inputs: client_type (required). Returns: result

get_column_infoA

Get detailed documentation and constructor parameters for a specific clearskies column type.

Args:
    column_type: The name of the column type (e.g. "String", "Integer", "BelongsToId").

Inputs: column_type (required). Returns: result

get_config_infoB

Get detailed documentation for a specific clearskies configuration type.

Args:
    config_type: The config type name.

Inputs: config_type (required). Returns: result

get_context_infoA

Get detailed documentation for a specific clearskies context type.

Args:
    context_type: The name of the context type (e.g. "Cli", "WsgiRef", "Wsgi").

Inputs: context_type (required). Returns: result

get_cursor_infoA

Get detailed documentation for a specific clearskies cursor type.

Args:
    cursor_type: The cursor type name.

Inputs: cursor_type (required). Returns: result

get_di_inject_infoA

Get detailed documentation for a specific clearskies DI inject helper.

Args:
    inject_type: The inject type name (e.g. "ByClass", "Utcnow").

Inputs: inject_type (required). Returns: result

get_endpoint_infoA

Get detailed documentation and configuration options for a specific clearskies endpoint type.

Args:
    endpoint_type: The name of the endpoint type (e.g. "RestfulApi", "Create", "List").

Inputs: endpoint_type (required). Returns: result

get_exception_infoA

Get detailed documentation for a specific clearskies exception type.

Args:
    exception_type: The exception type name (e.g. "InputError", "AuthenticationError").

Inputs: exception_type (required). Returns: result

get_functional_infoA

Get detailed documentation for a specific clearskies functional utility.

Args:
    func_name: The functional utility name.

Inputs: func_name (required). Returns: result

get_input_output_infoA

Get detailed documentation for a specific clearskies input/output handler.

Args:
    io_type: The input/output type name.

Inputs: io_type (required). Returns: result

get_migration_checklistA
Get a comprehensive checklist for v1 to v2 migration.

Returns:
    Dictionary with migration phases and tasks

Inputs: no named parameters. Returns: object

get_module_componentsA

Get detailed component information for a module.

Lists all components in a module, optionally filtered by category,
with their descriptions and constructor parameters.

Args:
    module_name: The module name (e.g. "clearskies-aws")
    category: Optional category filter (e.g. "backends", "contexts", "models")

Inputs: module_name (required), category. Returns: result

get_module_infoA

Get detailed documentation for a specific clearskies extension module.

Shows installation status, version, and all discovered components
with their descriptions and parameters.

Args:
    module_name: The module name (e.g. "clearskies-aws", "clearskies-graphql", "clearskies-snyk").

Inputs: module_name (required). Returns: result

get_query_infoB

Get detailed documentation for a specific clearskies query builder type.

Args:
    query_type: The query type name.

Inputs: query_type (required). Returns: result

get_query_result_infoC

Get detailed documentation for a specific clearskies query result type.

Args:
    result_type: The query result type name.

Inputs: result_type (required). Returns: result

get_secret_infoB

Get detailed documentation for a specific clearskies secrets handler.

Args:
    secret_type: The secret type name.

Inputs: secret_type (required). Returns: result

get_security_header_infoC

Get detailed documentation for a specific clearskies security header handler.

Args:
    header_type: The security header type name.

Inputs: header_type (required). Returns: result

get_validator_infoA

Get detailed documentation for a specific clearskies validator type.

Args:
    validator_type: The validator type name (e.g. "Required", "Unique", "Email").

Inputs: validator_type (required). Returns: result

list_available_authenticationA

List all available clearskies authentication types with a short description of each.

Authentication types are used to secure endpoints. They can be attached to endpoints
via the authentication parameter.

Example:
    clearskies.endpoints.RestfulApi(
        model_class=User,
        authentication=clearskies.authentication.SecretBearer(
            environment_key="API_SECRET"
        ),
        readable_column_names=["id", "name", "email"],
        writeable_column_names=["name", "email"],
        searchable_column_names=["name", "email"],
        sortable_column_names=["name"],
        default_sort_column_name="name",
    )

Inputs: no named parameters. Returns: result

list_available_backendsA

List all available clearskies backend types with a short description of each.

Inputs: no named parameters. Returns: result

list_available_clientsA

List all available clearskies client types with a short description of each.

Client types are used for making HTTP/API requests to external services.

Inputs: no named parameters. Returns: result

list_available_columnsA

List all available clearskies column types with a short description of each.

Inputs: no named parameters. Returns: result

list_available_configsA

List all available clearskies configuration types with a short description of each.

Configuration types are used to configure various aspects of clearskies behavior.

Inputs: no named parameters. Returns: result

list_available_contextsA

List all available clearskies context types with a short description of each.

Inputs: no named parameters. Returns: result

list_available_cursorsA

List all available clearskies cursor types with a short description of each.

Cursors are used internally by backends to execute database queries. Understanding these is useful for advanced backend customization.

Inputs: no named parameters. Returns: result

list_available_di_injectA

List all available clearskies DI inject helpers with a short description of each.

DI inject helpers are used to inject dependencies into your classes. They provide
special injection behaviors beyond simple class instantiation.

Example:
    class MyService:
        def __init__(self, utcnow: clearskies.di.inject.Utcnow):
            self.utcnow = utcnow

Inputs: no named parameters. Returns: result

list_available_endpointsA

List all available clearskies endpoint types with a short description of each.

Inputs: no named parameters. Returns: result

list_available_exceptionsA

List all available clearskies exception types with a short description of each.

These are the exceptions that clearskies may raise during operation. Understanding these helps with proper error handling in your application.

Inputs: no named parameters. Returns: result

list_available_functionalA

List all available clearskies functional utilities with a short description of each.

Functional utilities provide helper functions and decorators for common patterns.

Inputs: no named parameters. Returns: result

list_available_input_outputsA

List all available clearskies input/output handlers with a short description of each.

Input/output handlers define how data is read from requests and written to responses. They handle serialization formats like JSON, form data, etc.

Inputs: no named parameters. Returns: result

list_available_queryA

List all available clearskies query builder types with a short description of each.

Query builders are used to construct database queries programmatically.

Inputs: no named parameters. Returns: result

list_available_query_resultsA

List all available clearskies query result types with a short description of each.

Query result types handle the results returned from database queries.

Inputs: no named parameters. Returns: result

list_available_secretsA

List all available clearskies secrets handlers with a short description of each.

Secrets handlers provide secure access to sensitive configuration values like API keys, database passwords, etc.

Inputs: no named parameters. Returns: result

list_available_security_headersA

List all available clearskies security header handlers with a short description of each.

Security header handlers add security-related HTTP headers to responses, such as CORS headers, CSP, etc.

Inputs: no named parameters. Returns: result

list_available_validatorsB

List all available clearskies validator types with a short description of each.

Validators are used to validate model data before saving. They can be attached
to columns via the validators parameter.

Example:
    from clearskies.validators import MinimumLength, Required

    name = columns.String(validators=[Required(), MinimumLength(3)])

Inputs: no named parameters. Returns: result

list_modulesA

List all available clearskies extension modules with a summary of what each provides.

Shows installation status, version (if installed), and component counts for each known clearskies extension module.

Inputs: no named parameters. Returns: result

map_v1_to_v2A
Map a v1 code snippet to its v2 equivalent.

Useful for understanding how specific v1 patterns translate to v2.

Args:
    v1_code_snippet: The v1 code to convert
    context: Context hint ('model', 'handler', 'di', 'general')

Returns:
    Dictionary containing:
    - v2_code: Converted v2 code
    - breaking_changes: List of breaking changes
    - notes: Migration notes

Inputs: v1_code_snippet (required), context. Returns: object

refresh_module_cacheA

Refresh the module discovery cache.

Forces re-discovery of all modules, useful after installing new modules.

Inputs: no named parameters. Returns: result

scaffold_projectA

Generate a complete clearskies project with models and endpoints.

Returns the full file content for a working clearskies application.

Args:
    project_name: The name of the project/application.
    models: List of model definitions. Each dict has:
        - name (str): Model class name in PascalCase
        - columns (list[dict]): Column definitions (same format as generate_model)
        - backend_type (str, optional): Backend type (default: "MemoryBackend")
        - id_column_name (str, optional): Id column name (default: "id")
        - url (str, optional): URL path for the REST API
        - readable_column_names (list[str], optional): Readable columns
        - writeable_column_names (list[str], optional): Writeable columns
        - sortable_column_names (list[str], optional): Sortable columns
        - searchable_column_names (list[str], optional): Searchable columns
        - default_sort_column_name (str, optional): Default sort column
    context_type: The context type to use (default: "WsgiRef").
    endpoint_type: Endpoint type to use (default: "RestfulApi").

Inputs: models (required), project_name (required), context_type, endpoint_type. Returns: result

scaffold_restful_apiA

Generate a complete, runnable clearskies REST API application for a single model.

This is a convenience tool that generates a model, a RestfulApi endpoint, and a context
in a single file ready to run.

Args:
    model_name: Model class name in PascalCase (e.g. "User").
    columns: List of column definitions. Each dict has:
        - name (str): Column name
        - type (str): Column type
        - options (dict, optional): Column constructor options
    url: URL path (default: auto-generated from model name).
    backend_type: Backend type (default: "MemoryBackend").
    backend_options: Backend constructor options.
    authentication: Authentication expression.
    context_type: Context type (default: "WsgiRef").

Inputs: columns (required), model_name (required), url, backend_type, +3 more. Returns: result

suggest_modulesB

Suggest modules that provide a specific component type.

Args:
    component_type: The component category (e.g. "backends", "contexts", "models")

Inputs: component_type (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 54 tools

    Disambiguation3/5

    The list_available_X / get_X_info pairs are clearly distinct and well-partitioned by component category. However, the code-generation family has genuinely overlapping purposes: generate_model vs generate_model_with_relationships, generate_endpoint vs generate_endpoint_group, and scaffold_project vs scaffold_restful_api are easy to misselect. explain_concept vs explain_module vs explain_v1_v2_difference also risk confusion.

    Naming Consistency4/5

    Most tools follow a readable verb_noun snake_case pattern (list_available_columns, get_column_info, generate_model, explain_concept). Minor deviations like list_modules/get_module_info instead of list_available_modules break the otherwise predictable list_/get_info pairing. Still consistently snake_case throughout, no camelCase mixing.

    Tool Count2/5

    54 tools is very heavy, well past the 25+ threshold. While driven by many component categories, much of the count comes from repetitive list/get mirror pairs that could be consolidated, plus a large redundant generation/scaffolding family. Each tool does not clearly earn its place.

    Completeness4/5

    Coverage is broad: discovery (list/get), explanation, code generation, project scaffolding, module management, and v1→v2 migration tooling all present. Few dead ends for a framework-assistant server. Minor gaps around editing/validating generated code rather than only producing it.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Provides AI agents with architectural knowledge and scaffolding tools for LaunchFrame projects, covering patterns for authentication, queues, webhooks, and module structures. It enables agents to retrieve project-specific implementation details and generate code snippets on demand to maintain consistency.
      53
      19 npm
      2
      MIT