Skip to main content
Glama

How to connect StreamElements to Claude Code, ChatGPT and any AI agent

Yes, Claude, ChatGPT and other AI agents can work in your StreamElements account. StreamElements has an AI chatbot variable, $(ai), but it runs inside your stream chat, not as an app in ChatGPT or Claude. Cotlet.dev connects your own signed-in StreamElements account to any AI agent, so you can ask in plain words and the AI lists and edits your chat commands for you.

What you can ask

List all my StreamElements chat commands with their cooldown and user level, sorted by name.

Change the !discord command to reply "Join the crew: discord.gg/pixelpals" and set the cooldown to 30 seconds.

Update !schedule to say I stream Monday, Wednesday and Friday at 7 pm CET.

Which of my commands are disabled? Turn !giveaway and !merch back on.

Rename !socials to !links and add my new TikTok handle @pixelpals to the reply.

Related MCP server: Minecraft Command Execution MCP Server

Connect in 2 minutes

Get your API key at https://cotlet.dev/app and export it as COTLET_API_KEY.

Claude Code

claude mcp add --transport http cotlet https://cotlet.dev/mcp/v1 --header "Authorization: Bearer $COTLET_API_KEY"

ChatGPT

Settings → Apps → add connector URL https://cotlet.dev/mcp/v1, then sign in with Cotlet.dev. No API key needed.

Cursor

Copy .cursor/mcp.json from this repo into your project:

{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}

Run it locally (stdio)

This repo is a real MCP server. It speaks MCP over stdio, lists its StreamElements tools without any key, and forwards every tool call to the hosted Cotlet.dev server. The hosted URL above stays the recommended way. Use this when your client only starts local servers.

{"mcpServers":{"streamelements":{"command":"uvx","args":["streamelements-mcp"],"env":{"COTLET_API_KEY":"your-key"}}}}

Or with Docker:

docker build -t streamelements-mcp .
docker run -i --rm -e COTLET_API_KEY streamelements-mcp

Tools: streamelements_guide, streamelements_status, streamelements_open, streamelements_read, streamelements_click, streamelements_type, streamelements_close. Without COTLET_API_KEY a tool call answers: "Set COTLET_API_KEY. Get a key at https://cotlet.dev/app".

Command line

Python 3.10+, nothing else to install. From PyPI:

pip install streamelements-mcp        # or run it once: uvx streamelements-mcp connect
streamelements-mcp connect

Or straight from this repo:

export COTLET_API_KEY="your-key"
python3 streamelements_agent.py connect   # ready config for Claude Code, Cursor, ChatGPT
python3 streamelements_agent.py status    # is StreamElements ready in your Cotlet.dev account
python3 streamelements_agent.py guide     # StreamElements screens and sign-in link
python3 streamelements_agent.py read      # open StreamElements, read the page, close the browser
python3 streamelements_agent.py tools     # list Cotlet.dev tools
python3 streamelements_agent.py serve     # start the stdio MCP server (same as no argument)

Questions from StreamElements users

Is there StreamElements API documentation I need to use first?

You don't need to work with any StreamElements API. Cotlet.dev works in your own signed-in StreamElements account, so your AI agent can list and edit chat commands without code, tokens or API setup.

How do I connect StreamElements to ChatGPT?

Add Cotlet.dev as an app in ChatGPT (Settings → Apps, connector URL https://cotlet.dev/mcp/v1), sign in to StreamElements once in your Cotlet.dev Cloud Browser, and ask ChatGPT in plain words. No code and no StreamElements API key.

Is there a way to use Claude with StreamElements?

Yes. In Claude Code run the one-line claude mcp add command above; in the Claude app add https://cotlet.dev/mcp/v1 as a custom connector. Claude then works in your own StreamElements account.

Is there a StreamElements MCP server?

Cotlet.dev is a hosted MCP server that works in StreamElements for you, 24/7, with Claude, ChatGPT, Cursor, Codex, n8n, Make and Zapier.

Does StreamElements have a ChatGPT chatbot built in?

StreamElements has an AI chatbot variable, $(ai) (alias $(chatgpt)), that answers viewers inside your stream chat. To have ChatGPT or Claude manage your StreamElements commands for you, connect them with Cotlet.dev.

Find it on

Also works with


More: https://cotlet.dev/integrations/streamelements-api-mcp-server?utm_source=github&utm_medium=readme&utm_campaign=streamelements

Start free: https://cotlet.dev/signup?app=streamelements&utm_source=github&utm_medium=readme&utm_campaign=streamelements

Available Tools

7 tools
streamelements_clickC

Click a numbered element on the current StreamElements page.

NameRequiredDescriptionDefault
elementYesElement number from the last read.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full disclosure burden, yet it says nothing about side effects: whether the click navigates to a new page, submits a form, mutates state, or invalidates the numbering returned by the last read. For an interaction tool that can trigger arbitrary page actions, this is a major gap.

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?

A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity borders on under-specification given the tool's side-effecting nature.

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?

With no annotations, no output schema, and side effects undisclosed, an agent cannot tell what state exists after the click or whether it needs to re-read the page before the next action. For an interaction primitive in a stateful browser-automation suite, that omission leaves a critical decision point uncovered.

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 coverage is 100% and the schema already defines 'element' as an integer >= 1 taken from the last read. The description's phrase 'numbered element' restates that without adding format, range, or failure-mode context, so the baseline of 3 applies.

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?

States a concrete verb (click) and a concrete target (a numbered element on the current StreamElements page), which is enough to distinguish it from streamelements_read, streamelements_type, and streamelements_open. It does not explicitly call out the sibling it is not, but the action is unambiguous.

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 never says when to click versus type, open, or close, nor does it state the precondition that element numbers come from a prior read — that hint lives only in the parameter schema. An agent must infer the read-then-click workflow and any freshness requirement on its own.

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

streamelements_closeA

Close the StreamElements browser session when the work is done, so credits stop running.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations supplied, the description carries the full behavioral burden. It does add genuinely useful context that the caller would not otherwise know: that a live session consumes credits, which motivates the call. It says nothing about idempotency, behavior when no session exists, or what happens if an interaction is mid-flight, so the mutation/termination semantics remain partly opaque.

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?

One sentence, front-loaded with the action and resource, followed by the condition and the rationale. Every clause earns its place and nothing is padded.

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

Completeness4/5

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

For a zero-parameter, non-destructive session-termination tool with no output schema, the description covers the essential what, when, and why. Only minor gaps remain around failure or repeat-call behavior, which are unlikely to change how an agent invokes it.

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

Parameters4/5

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

The tool takes zero parameters and the schema is empty with additionalProperties false, so there is no parameter meaning for the description to add. Baseline 4 applies; nothing is missing or contradicted.

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?

States a specific verb ('Close') and a specific resource ('StreamElements browser session'), which is enough to distinguish it from streamelements_open and the other interaction siblings. It stops short of naming the counterpart tool explicitly, so the pairing is inferred rather than stated.

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

Usage Guidelines4/5

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

Gives a clear trigger condition: 'when the work is done'. That is real when-to-use guidance for a cleanup tool. It does not address edge cases such as whether it is safe to call if no session was opened, but no plausible alternative tool competes with it.

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

streamelements_guideA

How to work in StreamElements (list and edit chat commands): its screens and the sign-in link. Call this first.

NameRequiredDescriptionDefault
taskNoWhat you want done in StreamElements, in your words.

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It hints that a sign-in link may be returned, but it never says whether the tool only returns instructions or takes any action, nor what format the guidance arrives in. For a low-risk guide tool this is acceptable but thin.

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?

Two short sentences with the subject front-loaded and the sequencing rule at the end. The parenthetical and the odd colon usage add a little friction but nothing is wasted.

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

Completeness3/5

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

For a simple one-parameter guide tool with no output schema, the agent still lacks a sense of what comes back (steps, screens list, sign-in URL) and how to combine that with the sibling open/click/type tools. It is adequate but leaves a meaningful gap about the workflow it is meant to unlock.

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 100% for the single optional 'task' parameter, and the description adds no further meaning about how to phrase it or what happens when it is omitted. Baseline 3 applies since the schema already does the work.

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 names a specific resource (StreamElements: screens, sign-in link) and a specific function (guidance on how to list and edit chat commands), which separates it from siblings like streamelements_read or streamelements_click. It is slightly muddled by 'list and edit chat commands', which could be read as the tool performing those actions rather than explaining them.

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

Usage Guidelines4/5

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

'Call this first.' gives an explicit ordering rule that routes the agent here before the other streamelements_* tools. It does not state when to skip it (for example, after orientation is already done), which keeps it short of a 5.

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

streamelements_openB

Open a StreamElements page in your signed-in Cloud Browser (default https://streamelements.com) to work with list and edit chat commands.

NameRequiredDescriptionDefault
urlNoPage to open. Default: https://streamelements.com

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose a valuable trait the schema cannot: the page opens in the user's already signed-in Cloud Browser, so authentication state is inherited. It does not say whether this navigates the current page or a new tab, what happens if a page is already open, or what is returned on success.

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?

One sentence, front-loaded with the action and destination, with no filler. The parenthetical default is slightly redundant with the schema but does not bloat the definition.

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

Completeness3/5

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

For a one-optional-parameter navigation tool with no output schema and no annotations, the description covers purpose and auth context adequately. It leaves open what the agent gets back after opening the page (e.g., page content or state) and how this interacts with a previously open page, which matters for chaining into the click/type siblings.

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 100% and the single optional url parameter is fully documented there. The description only restates the default URL, which duplicates the schema rather than adding format or constraint detail, so the baseline 3 applies.

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?

States a specific verb (open) and resource (a StreamElements page in the signed-in Cloud Browser), plus the default URL and the downstream intent (list/edit chat commands). This clearly separates it from siblings like streamelements_read, streamelements_click, and streamelements_close, though it never names them explicitly.

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

Usage Guidelines3/5

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

The phrase 'to work with list and edit chat commands' implies when this tool is appropriate, but there is no explicit when-not guidance and no routing to alternatives such as streamelements_read for reading content or streamelements_guide for help. Usage is inferable rather than stated.

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

streamelements_readB

Read the current StreamElements page: its text and numbered buttons, links and fields.

NameRequiredDescriptionDefault
elementNoRead only inside this element.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does useful work by disclosing the return contents (text, numbered buttons, links, fields), which tells the agent the page is presented as an indexed, actionable view. It does not say whether the read is passive, whether numbering is stable across calls, or whether large pages are truncated.

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?

One sentence, front-loaded with the verb and the target, with the payload listed after the colon. Nothing is wasted, though the compressed phrasing leaves helpful detail such as the numbering convention unstated.

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

Completeness3/5

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

For a one-parameter read tool with no output schema and no annotations, the description covers what comes back but not the conventions an agent needs — notably that the numbered buttons are the handles consumed by streamelements_click. Adequate but with a real gap for a browser-driving toolset.

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 coverage is 100% and the single 'element' parameter is documented as 'Read only inside this element', so the schema does the work. The description says nothing about scoping or the meaning of element, so it adds no meaning beyond the schema — the baseline 3 applies.

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?

States a specific verb (Read) and a specific resource (the current StreamElements page), then enumerates what is returned: text, numbered buttons, links and fields. That goes well beyond the name, though it never names a sibling tool, so an agent must infer from the sibling list that this is the inspection half of a click/type workflow.

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

Usage Guidelines3/5

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

Usage is only implied: reading the page is obviously a precursor to streamelements_click and streamelements_type, but the description never says so, nor does it state when to prefer this over streamelements_status or streamelements_guide. No exclusions or prerequisites are given.

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

streamelements_statusB

Check that your Cotlet.dev account and StreamElements are ready: account, credits and StreamElements connection.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It does disclose the scope of the check (account, credits, connection), and a zero-parameter "status" query naturally reads as side-effect free, but it says nothing about what a not-ready result looks like or what the agent should do about a failed connection.

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?

A single compact sentence with the resource list up front and no filler. The colon-separated enumeration is slightly awkward and the Cotlet.dev branding adds noise, but nothing needs cutting.

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

Completeness3/5

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

For a trivial zero-parameter probe with no output schema, the description covers what is inspected but not what the result means or how to act on a negative outcome. It is adequate to call correctly, but thin on interpretation guidance.

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

Parameters4/5

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

The tool takes no parameters, so there is no parameter meaning to convey and the baseline is 4. The description correctly avoids inventing inputs for a parameterless call.

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?

"Check" plus three named subjects (account, credits, StreamElements connection) tells the agent this is a readiness/health probe, which is clearly distinct from the action-oriented siblings (read, open, click, type, close). It loses a point because "ready" is never defined and the "Cotlet.dev account" framing is ambiguous about what is actually being checked.

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?

There is no explicit statement of when to call this versus streamelements_read or streamelements_guide, and no mention of it being a prerequisite check before the other tools. The word "ready" only implies it should be run first; that routing decision is left entirely to inference.

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

streamelements_typeB

Type text into a numbered field on the current StreamElements page.

NameRequiredDescriptionDefault
textYesText to type.
elementYesField number from the last read.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the entire burden and leaves key behaviors unstated: whether typing overwrites or appends to existing field content, whether it triggers input/change/submit events, whether focus is required first, and what happens on an invalid field number. For a mutating UI-automation tool with zero annotation coverage this is a significant gap.

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?

A single front-loaded sentence with no filler and no redundant restatement of the tool name. Every word carries information about the action and the target.

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?

With no annotations, no output schema, and no statement of side effects or return behavior, an agent cannot tell what this tool reports back or how the page changes after typing. For a browser-automation mutation tool, the definition should disclose more than the action alone.

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 100%, so both parameters are already documented, including the useful 'Field number from the last read' hint. The description adds nothing beyond restating 'numbered field' and 'text', so the schema does the work and the baseline of 3 applies.

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?

Names a specific verb ('Type text') and a specific target ('a numbered field on the current StreamElements page'), which distinguishes it from streamelements_click and streamelements_read. It stops short of explicitly naming which sibling to use when, but the action itself is unambiguous.

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

Usage Guidelines3/5

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

The phrase 'on the current StreamElements page' implies a prerequisite (a page must already be open) and 'numbered field' implies a prior read, but neither is stated as a rule. There is no explicit when-not guidance or comparison with siblings such as streamelements_click, which an agent would need to choose between.

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. 7 tool updatesv1.1.0
    • First observedstreamelements_click
    • First observedstreamelements_close
    • First observedstreamelements_guide
    • First observedstreamelements_open
    • First observedstreamelements_read
    • First observedstreamelements_status
    • First observedstreamelements_type

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation4/5

Each tool maps to a distinct browser-automation action: open, read, click, type, close, plus guide and status. The boundaries between guide (instructions) and status (readiness check) are clear enough, though both are meta-tools that could initially be confused. Open versus read is also distinguishable because one navigates and the other extracts content.

Naming Consistency5/5

All tools follow the same streamelements_<verb> snake_case pattern. The prefix is consistent and the verbs are simple and readable. There is no mixing of camelCase or conflicting conventions.

Tool Count5/5

Seven tools is a well-scoped set for a browser-automation workflow focused on StreamElements chat-command management. Each tool has a clear role, and none appears redundant or purely decorative.

Completeness4/5

The surface covers the core lifecycle: sign-in guidance, readiness check, opening a page, reading it, interacting via click and type, and closing the session. Minor gaps exist around navigation history or waiting for dynamic updates, but the essential list-and-edit workflow is covered.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables interaction with the Twitch API, allowing users to retrieve comprehensive information about channels, streams, games, and more, with additional support for searching and accessing chat elements like emotes and badges.
    14
    217 npm
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage WooCommerce stores, including products, orders, customers, categories, coupons, attributes, variations, order notes, refunds, reports, payment gateways, meta data, reviews, settings, data, posts, and system status through natural language.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to manage Top.gg bot or server listings, including updating project info, checking votes, posting metrics, and registering commands.
    8
    9 npm
    3
    ISC