Skip to main content
Glama
marioluciofjr

MCP-Server de Mapas Mentais

MCP-思维导图服务器

使用 Python 制作 许可证 - 麻省理工学院网站 - prazocerto.me领英 - @marioluciofjr

动态 MCP 服务器管理服务,可动态创建、运行和管理模型上下文协议 (MCP) 服务器。该服务作为 MCP 服务器,并以子进程的形式启动/管理其他 MCP 服务器,从而实现灵活的 MCP 生态系统。

指数

Related MCP server: CaptureMind

介绍

mapas_mentais 项目是一个 Python 应用程序,可以生成自动思维导图,以方便学习、审查、比较和展示不同主题。系统利用MCP-server的思想,通过Claude模型直接与Claude Desktop交互来提供洞察。该项目非常适合想要以直观和高效的方式组织想法的学生、教师和专业人士,它易于扩展,并且可以与其他自动化系统或虚拟助手集成。

项目结构

该项目的想法源自戈亚斯联邦大学 (UFG) 的 Sandeco Macedo 教授通过《MCP 和 A2A for Dummies》一书对 MCP 的解释。它是一个简单的 MCP 服务器,仅使用 FastMCP 包,同时遵循 Anthropic 的模型上下文协议官方存储库的指导方针。

本 MCP-Server 中使用的六种思维导图类型为:

  • 呈现——为某个主题的演示生成思维导图;

  • 比较——生成比较两个主题的思维导图;

  • 初始——生成关于该主题的初始知识的思维导图;

  • 中级——生成该主题中级知识的思维导图;

  • 问题——生成与主题相关的问题分析的思维导图;

  • 审查 - 生成思维导图来审查某个主题的内容。

使用的技术

要求

  • 安装了 Python(版本 3.10 或更高版本);

  • uv包已安装;

  • 已安装 Claude Desktop。

如何在 Claude Desktop 上安装

现在我将详细说明如何在 Windows 11 中使用 VSCode 中的终端(快捷键CTRL + SHIFT + ' )逐步完成此操作:

  1. 我已经安装了最新版本的 Python

  2. 在 VSCode 中,我使用终端通过以下命令检查 Python 版本

    python --version
  3. 所以我安装了带遥控器的uv

    pip install uv
  4. 为了检查一切是否正常,我使用了命令

    uv
  5. 为了创建项目文件夹,我使用了这个命令

    mkdir “C:\Users\meu_usuario\OneDrive\area_de_trabalho\mapas_mentais”

[!IMPORTANT] 这并不一定意味着您将使用相同的路径,您可能想要使用另一条路径,例如下面的路径。

  mkdir "C:\Users\seu_usuario\mapas_mentais"

或者,您也可以直接通过 GitHub 上的Code > Download ZIP将此项目的 zip 下载到您的机器上

图像

  1. 我将刚刚创建的文件夹命名为

    cd “C:\Users\meu_usuario\OneDrive\area_de_trabalho\mapas_mentais”
  2. 我使用下面的命令打开另一个 VSCode 窗口并直接在文件夹中继续执行其他命令

    code .

[!IMPORTANT] 如果您不想通过终端创建文件夹,您可以在桌面或其他容易记住的位置创建一个新文件夹,以便使用 VSCode CTRL + O中的快捷方式。然后只需查找刚刚创建的文件夹,单击它并在 VSCode 中打开它。或者只需将此存储库的完整文件夹导入到您的 VSCode 中。

  1. 回到终端,我使用下面的命令初始化一个新的 Python 项目,自动创建配置文件和依赖项

    uv init
  2. 然后我使用下面的命令创建一个独立的 Python 虚拟环境来安装项目依赖项。

    uv venv
  3. 为了激活 .venv,我使用了以下命令

.venv\Scripts\Activate.ps1
  1. 我添加了 MCP 依赖项,这是项目所必需的

uv add mcp[cli]
  1. 我使用以下命令检查一切是否正常

uv run mcp

[!IMPORTANT] 如果您的终端上出现以下信息,则一切正常。

图像

  1. 为了创建server.py文件,我使用了这个命令

uv init --script server.py

[!TIP] 由于您可能已经下载了此存储库的文件夹,因此此时server.py文件已经存在于您的 VSCode 中。

  1. 我将下面的 json 从 MCP-Server 直接安装到claude_desktop_config.json文件中

"mapas_mentais": {
  "command": "uv",
  "args": [
    "--directory",
    "C://Users//meu_usuario//OneDrive//area_de_trabalho//mapas_mentais",
    "run",
    "server.py"
  ]
}

[!IMPORTANT] 如果您已经正确安装了 Claude Desktop,请按照路径访问计算机上的claude_desktop_config.json文件
14日。打开 Claude Desktop 后,使用快捷键CTRL + ,
14b.单击Desenvolvedor选项卡,然后单击Editar configuração
14c.找到claude_desktop_config.json文件并在 VSCode 中正确编辑它
14d.使用CTRL + S保存文件
14e.关闭 Claude Desktop 并在几秒钟后重新打开
14f.检查配置图标,查看 MCP“mental_maps”工具是否安装正确

图像

这些工具被命名为“现在”、“比较”、“初始”、“中间”、“问题”和“审查”。

有用的链接

贡献

欢迎投稿!如果您有改进此项目的想法,请随意分叉存储库。

执照

该项目根据 MIT 许可证获得许可 - 有关详细信息,请参阅LICENSE文件。

接触

马里奥·卢西奥 - Deadline®

Available Tools

6 tools
apresentaC

Gera um mapa mental para apresentações sobre um tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
temaYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool generates a mind map but doesn't describe what format the output takes (e.g., text, image, structured data), whether it's a read-only or mutating operation, or any performance characteristics. For a generation tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise - a single sentence that directly states the tool's function. There's no wasted language or unnecessary elaboration. It's appropriately sized for a simple tool with one parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and minimal parameter documentation, the description is incomplete. It tells what the tool does at a high level but doesn't provide enough information about how to use it effectively, what to expect as output, or how it differs from sibling tools. For a generation tool, more context about output format and behavioral characteristics would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 0% description coverage, and the tool description doesn't mention any parameters at all. While the parameter 'tema' (topic) is self-explanatory, the description provides no additional context about what constitutes a valid topic, format expectations, or examples. With low schema coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Gera um mapa mental para apresentações sobre um tema' (Generates a mind map for presentations on a topic). It specifies the verb ('gera' - generates) and resource ('mapa mental' - mind map) with the context of presentations. However, it doesn't differentiate from sibling tools like 'compara' or 'revisa' which might have related functions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any prerequisites, exclusions, or suggest when to choose this over sibling tools like 'compara' or 'revisa'. The usage context is implied (for presentations on a topic) but lacks explicit when/when-not instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

comparaC

Gera um mapa mental comparando dois temas.

ParametersJSON Schema
NameRequiredDescriptionDefault
tema1Yes
tema2Yes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'gera' (generates) implies a creation operation, the description doesn't specify whether this is a read-only or mutating action, what permissions might be required, whether there are rate limits, or what the output format looks like. For a tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence: 'Gera um mapa mental comparando dois temas.' It's front-loaded with the core action and includes all essential elements (action, resource, scope) without any wasted words. Every part of the sentence contributes directly to understanding the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (a mind map generation tool with two parameters), lack of annotations, and no output schema, the description is insufficiently complete. It doesn't explain what the mind map output contains, how comparisons are structured, whether there are limitations on theme complexity, or what happens if themes are invalid. For a creative/generation tool, more contextual guidance would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description mentions 'dois temas' (two themes), which aligns with the two parameters (tema1 and tema2) in the schema. However, with 0% schema description coverage, the schema provides no details about these parameters. The description adds basic semantic context (they represent themes to compare) but doesn't elaborate on format, constraints, or examples. This meets the baseline for minimal parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Gera um mapa mental comparando dois temas' (Generates a mind map comparing two themes). It specifies the verb ('gera' - generates), resource ('mapa mental' - mind map), and scope ('comparando dois temas' - comparing two themes). However, it doesn't explicitly distinguish this from sibling tools like 'apresenta' or 'revisa', which might also involve presentation or review functions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There are no explicit instructions about when this tool is appropriate, when it should not be used, or what sibling tools might serve as alternatives for related tasks. The agent must infer usage from the purpose alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inicialC

Gera um mapa mental de conhecimentos iniciais sobre o tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
temaYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions generation but doesn't disclose behavioral traits like whether this is a read-only operation, if it requires authentication, rate limits, or what format the mind map output takes. The description is minimal and lacks essential operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's function. It's appropriately sized and front-loaded with the core action, though it could be more structured with additional context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (generating a mind map), lack of annotations, no output schema, and minimal parameter details, the description is incomplete. It doesn't explain what the output looks like, how the mind map is structured, or any limitations, leaving significant gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It implies the parameter 'tema' is the topic for the mind map, adding some meaning beyond the bare schema. However, with only one parameter, the baseline is 4, but the description doesn't fully detail the parameter's semantics (e.g., format, scope), so it scores slightly lower.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool 'generates an initial knowledge mind map about the topic', which provides a clear verb ('generates') and resource ('mind map'). However, it doesn't specify what distinguishes this from sibling tools like 'apresenta' or 'revisa', leaving the purpose somewhat vague in context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, appropriate contexts, or exclusions, leaving the agent with no usage direction beyond the basic purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

intermediarioC

Gera um mapa mental de conhecimentos intermediários sobre o tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
temaYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool generates a mind map, implying a read-only or creative operation, but doesn't clarify if it requires specific inputs beyond the topic, how the output is structured, whether it's cached or real-time, or any error conditions. For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence in Portuguese: 'Gera um mapa mental de conhecimentos intermediários sobre o tema.' It is front-loaded with the core action and resource, with no wasted words. Every part of the sentence contributes to understanding the tool's purpose efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no annotations, no output schema, and low schema description coverage (0%), the description is incomplete. It doesn't explain what 'conhecimentos intermediários' (intermediate knowledge) means, how the mind map is returned (e.g., text, image, structured data), or any limitations. For a tool that likely produces complex output, more context is needed to use it effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description mentions 'sobre o tema' (on the topic), which aligns with the single parameter 'tema' (topic) in the input schema. However, schema description coverage is 0%, so the schema provides no additional details about the parameter. The description adds minimal semantic context by implying the parameter is a topic string, but doesn't specify format, length, or examples. With one parameter and low coverage, this is adequate but basic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Gera um mapa mental de conhecimentos intermediários sobre o tema' (Generates a mind map of intermediate knowledge on the topic). It specifies the action (generate), the resource (mind map), and the scope (intermediate knowledge on a topic). However, it doesn't explicitly distinguish this tool from its siblings like 'inicial' or 'revisa', which might also be related to knowledge mapping or topic exploration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any prerequisites, context for 'intermediate knowledge', or how it differs from sibling tools such as 'apresenta', 'compara', 'inicial', 'problemas', or 'revisa'. Without this information, an AI agent must guess based on tool names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

problemasC

Gera um mapa mental de análise de problemas relacionados ao tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
temaYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool generates a mind map but doesn't describe what the output looks like (e.g., format, structure), whether it's a read-only or mutative operation, or any constraints like rate limits or permissions. For a tool with zero annotation coverage, this is a significant gap in behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It's appropriately sized for a simple tool, though it could be more front-loaded with additional context if needed. The structure is clear but minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (simple with 1 parameter), lack of annotations, and no output schema, the description is incomplete. It doesn't explain the return values (e.g., what the mind map output entails), behavioral traits, or detailed parameter usage. For a tool with no structured data support, the description should provide more comprehensive context to guide the agent effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter ('tema') with 0% description coverage in the schema itself. The tool description mentions 'related to the theme', which loosely maps to the 'tema' parameter, but doesn't add meaningful semantics such as what constitutes a valid theme, examples, or constraints. With low schema coverage, the description fails to adequately compensate for the lack of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool 'generates a mind map for problem analysis related to the theme', which provides a clear verb ('generates') and resource ('mind map'). However, it doesn't distinguish this from sibling tools like 'apresenta' or 'compara', leaving the specific differentiation unclear. The purpose is understandable but lacks sibling context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'apresenta' or 'compara'. It implies usage for problem analysis related to a theme, but doesn't specify prerequisites, exclusions, or comparative contexts with other tools. This leaves the agent with minimal direction for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revisaC

Gera um mapa mental para revisão de conteúdo sobre um tema.

ParametersJSON Schema
NameRequiredDescriptionDefault
temaYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'gera' (generates) implies a creation operation, the description doesn't specify whether this is a read-only or mutative action, what permissions might be required, whether the output is stored or temporary, or any rate limits. It mentions the output type (mind map) but not its format or structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence in Portuguese that directly states the tool's function. It is appropriately sized and front-loaded with the core action, with no unnecessary words or redundant information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (a tool that generates a mind map), lack of annotations, no output schema, and low schema coverage, the description is incomplete. It doesn't explain what the mind map output looks like, how it's structured, whether it's visual or textual, or any behavioral aspects like error handling. For a generative tool with no structured data, this leaves significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds minimal meaning beyond the input schema. It mentions 'tema' (topic) as the subject for the mind map, which aligns with the single parameter 'tema' in the schema. However, with 0% schema description coverage, the parameter is undocumented in the schema, and the description doesn't elaborate on what constitutes a valid 'tema' or provide examples. The baseline is 3 since schema coverage is low but the description partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Gera um mapa mental para revisão de conteúdo sobre um tema' (Generates a mind map for content review on a topic). It specifies the verb ('gera' - generates), resource ('mapa mental' - mind map), and context ('revisão de conteúdo' - content review). However, it doesn't differentiate from sibling tools like 'apresenta' or 'compara', which likely have different functions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when this tool is appropriate, when to use sibling tools instead, or any prerequisites. The context is implied (content review on a topic) but lacks explicit usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 6 tool updates
    • First observedapresenta
    • First observedcompara
    • First observedinicial
    • First observedintermediario
    • First observedproblemas
    • First observedrevisa

TDQS

B3.1/5.0

Scored across 6 tools

Disambiguation3/5

The tools have overlapping purposes as they all generate mind maps, but their descriptions help differentiate them by specifying distinct contexts like presentations, comparisons, knowledge levels, problem analysis, and review. However, 'inicial' and 'intermediario' could be confused as they both relate to knowledge levels without clear boundaries.

Naming Consistency5/5

All tool names follow a consistent pattern using Portuguese verbs in a simple, uniform style (e.g., 'apresenta', 'compara', 'inicial'). There are no deviations in naming conventions, making them predictable and readable.

Tool Count5/5

With 6 tools, the count is well-scoped for a mind map generation server, covering various use cases like presentations, comparisons, and reviews. Each tool appears to serve a distinct purpose, making the set appropriately sized.

Completeness4/5

The tool surface covers key mind map generation scenarios, including creation for different contexts and review. A minor gap exists in lacking explicit update or delete operations for existing mind maps, but agents can likely work around this by regenerating maps as needed.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables conversion of plain text descriptions and Markdown content into interactive mind maps using AI. Automatically uploads generated mind maps to Aliyun OSS and provides online access links.
    22 npm
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Captures ideas from conversations and organizes them into a persistent, hierarchical mindmap. Supports search, deduplication, export, import, and cloud sync.
    13
    17 npm
    MIT