Skip to main content
Glama

📱 Servidor MCP "celular"

Um servidor MCP (Model Context Protocol) que dá a um assistente de IA, como o Claude Desktop, ferramentas para:

  • ver se há um celular Android conectado por USB e abrir um app nele (via adb);

  • tocar no VLC as músicas e vídeos de pastas que você escolheu;

  • abrir as suas curtidas do SoundCloud no navegador;

  • apertar as teclas de mídia do Windows (tocar/pausar, próxima, anterior, volume, mudo).

Na prática, você diz "abre meu app de estudos no celular e toca a pasta Treino em modo aleatório" e o assistente faz.

Sem dependências: é um único arquivo em Node.js puro, sem npm install.

Ferramentas expostas

Ferramenta

O que faz

Altera algo?

status

Diz se há celular conectado e se o app está instalado

Não

abrir_ypt

Abre o app YPT (cronômetro de estudos) no celular

Só abre o app

midia_status

Lista as pastas configuradas, com quantas músicas e vídeos cada uma tem

Não

tocar_pasta

Toca uma pasta no VLC, em ordem ou aleatório, em loop

Abre o VLC

abrir_soundcloud

Abre soundcloud.com/you/likes no navegador padrão

Abre o navegador

controle_midia

Aperta uma tecla de mídia do Windows

Controla o player

Cada ferramenta declara as annotations do MCP (readOnlyHint, destructiveHint…), para o assistente saber o que é só leitura e o que tem efeito.

Related MCP server: scrcpy-mcp

Instalação

Requisitos: Windows, Node.js 16 ou mais novo, adb no PATH (só para as ferramentas do celular) e VLC (opcional: sem ele, a playlist abre no player padrão).

  1. Copie midia.exemplo.json para midia.json e coloque as suas pastas:

    {
      "pastas": [
        {"nome": "Treino", "caminho": "C:/Users/SEU_USUARIO/Music/Treino"}
      ]
    }
  2. Registre o servidor no claude_desktop_config.json do Claude Desktop:

    {
      "mcpServers": {
        "celular": {
          "command": "node",
          "args": ["C:/caminho/para/servidor-mcp-celular/celular-mcp.js"]
        }
      }
    }
  3. Reinicie o Claude Desktop. As ferramentas aparecem com o nome celular.

Variáveis de ambiente (opcionais)

Variável

Para quê

Padrão

ADB_PATH

Caminho do adb

adb (do PATH)

VLC_PATH

Caminho do vlc.exe

C:\Program Files\VideoLAN\VLC\vlc.exe

MIDIA_CONFIG

Outro arquivo de pastas

midia.json ao lado do script

Testar sem o Claude

O protocolo é JSON-RPC, uma mensagem por linha, pela entrada padrão:

echo {"jsonrpc":"2.0","id":1,"method":"tools/list"} | node celular-mcp.js

🔒 Segurança

  • Só toca pastas que você listou em midia.json. O assistente não consegue abrir caminhos arbitrários.

  • midia.json (com os caminhos do seu PC) está no .gitignore e não vai para o Git.

  • No celular, ele só abre o app: não toca na tela, não instala nada, não lê arquivos.

  • Tudo roda localmente: nenhuma porta de rede é aberta e nada é enviado para fora.

Como funciona

  • Implementa à mão o mínimo do MCP sobre stdio (initialize, ping, tools/list, tools/call), sem SDK.

  • As teclas de mídia usam keybd_event da user32.dll, chamada via PowerShell.

  • A playlist é gerada como .m3u8 na pasta temporária e aberta no VLC com --one-instance.

Licença

MIT — veja LICENSE.

Available Tools

6 tools
abrir_soundcloudA
Idempotent

Abre as curtidas do SoundCloud (soundcloud.com/you/likes) no navegador padrão do PC.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context that the action happens in the local default browser rather than returning data, but it omits whether a SoundCloud session/login is required and what the call returns on success or failure.

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 sentence with zero filler, front-loading the action and resource, with the URL parenthetical as a compact disambiguator. Nothing could be removed without losing information.

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 simple zero-parameter browser-launch tool with annotations covering safety and open-world behavior, the definition is nearly complete. The only real gap is the unstated prerequisite of an authenticated SoundCloud session and any failure behavior if no browser is available.

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, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies. The description correctly implies no input is needed to perform the action.

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 ("Abre"), a specific resource (SoundCloud likes at soundcloud.com/you/likes), and the execution target (default PC browser). An agent can distinguish it from siblings like abrir_ypt or controle_midia from the resource alone, though the description never names those alternatives 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?

Usage is only implied: the agent can infer this is the tool for showing a user their SoundCloud likes in a browser. There is no explicit statement of when to prefer it over controle_midia or abrir_ypt, and no preconditions (e.g., being logged in) are mentioned.

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

abrir_yptA
Idempotent

Abre o app YPT na tela inicial do celular conectado por USB. Não inicia nenhum cronômetro.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare idempotent, non-destructive, closed-world behavior, so the description's added details matter more: it discloses the USB-tethered prerequisite and clarifies the side effect that no timer is started. It does not cover failure behavior when no phone is connected, keeping it below a 5.

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?

Two short sentences with no wasted wording, and the core action is front-loaded ahead of the clarifying negative. Every sentence earns its place.

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 launch tool with no output schema, the description supplies the essential precondition (USB-connected phone) and the notable non-effect (no timer started). Only edge-case behavior such as what happens if the device is disconnected is absent.

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, so there is nothing for the description to disambiguate; the baseline for a parameterless schema applies. No parameter claims are made 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 and resource ("Abre o app YPT") plus the target location ("tela inicial do celular conectado por USB"), which an agent can distinguish from siblings like abrir_soundcloud. It doesn't explicitly name a sibling to contrast with, so it falls just short of a 5.

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 clause "Não inicia nenhum cronômetro" implicitly tells the agent this is the choice when the app should be opened without starting a timer, which is a useful exclusion. However, it never explicitly states when to prefer this over abrir_soundcloud or tocar_pasta, leaving the routing to inference.

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

controle_midiaB

Aperta uma tecla de mídia do Windows: controla o que estiver tocando no PC (VLC, SoundCloud no navegador…).

NameRequiredDescriptionDefault
acaoYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=false. The description adds useful context beyond them by revealing the underlying mechanism (a simulated Windows media key) and that it targets whatever is currently playing, which explains the non-idempotency. It does not say what happens when nothing is playing, which app wins when multiple media sessions exist, or whether there is a return value.

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: mechanism first, effect second, examples last. Slightly denser than necessary, but every clause contributes meaning.

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 enum tool with no output schema, the description covers what it does and its side effects adequately. The remaining gap is outcome reporting — an agent cannot tell whether the call returns the new playback state or just an acknowledgement, nor how failure (no active media session) surfaces.

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 carry the parameter burden; it partially does by framing the tool as pressing a media key, which makes the enum values (tocar_pausar, proxima, anterior, volume_mais, volume_menos, mudo) largely self-interpreting. However, it does not map or explain any individual enum value, so the compensation is incomplete.

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 mechanism ('Aperta uma tecla de mídia do Windows') and the resource it affects ('o que estiver tocando no PC'), with concrete examples (VLC, SoundCloud no navegador). It is clearly distinguishable from siblings like midia_status or tocar_pasta, though it never explicitly contrasts itself with them.

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: an agent can infer this is the tool for play/pause/skip/volume control, but there is no explicit when-to-use versus midia_status (which presumably reports state) or tocar_pasta/abrir_soundcloud (which start playback). No prerequisites or exclusions are stated.

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

midia_statusA
Read-only

Lista as pastas de música/vídeo configuradas em midia.json com quantas músicas e vídeos cada uma tem, e se o VLC está instalado.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real value by naming the data source (the local `midia.json` config) and the shape of the result (per-folder counts plus a VLC-installed check). It does not state what happens if midia.json is missing or malformed, which is the main residual 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 sentence, front-loaded with the primary action and followed by the return contents. Every clause carries information; nothing is repeated from the title or annotations.

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?

With no output schema and no parameters, the description carries the burden of explaining what comes back, and it does so (folders, song/video counts, VLC status). Only failure modes for an absent or invalid config file are left unaddressed, which is minor for a read-only diagnostic.

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, so there is nothing to disambiguate and the schema cannot be improved upon. The description correctly implies no input is required.

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 gives a specific verb-plus-resource ("Lista as pastas de música/vídeo configuradas em midia.json") and even previews the payload (counts per folder, VLC presence). It does not explicitly distinguish itself from the sibling `status`, which an agent could plausibly confuse with `midia_status` from the names alone.

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?

No explicit when-to-use or when-not-to-use statement, and no alternative is named. Usage is only implied by the content described: an agent can infer it is a read-only configuration/inventory check that precedes `tocar_pasta` or `controle_midia`, but that inference is not stated.

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

statusA
Read-only

Diz se há um celular Android conectado por USB (adb) e se o YPT está instalado nele.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already mark it read-only and closed-world, so safety is covered; the description adds the substantive behavior that two distinct conditions are probed (adb/USB presence and YPT installation). It does not describe the response shape, but with no output schema the semantics of 'what it reports' are at least conveyed at a high level.

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 verb and both conditions checked, with no filler or redundant restatement of the title.

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 read-only probe this is close to sufficient: it says what is inspected and implicitly that a yes/no result follows. Only the exact output form (booleans vs message) is left unstated, and with no output schema that is a minor gap.

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, so there is nothing for the description to disambiguate; baseline applies. The schema coverage is 100% and the description adds no parameter claims that could conflict.

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 check: whether an Android phone is connected over USB via adb and whether YPT is installed on it. That is far more specific than the bare name 'status' and distinguishes it from the menu/media siblings, though it never explicitly contrasts itself with midia_status.

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 statement of when to call this versus alternatives such as midia_status, and no mention that it functions as a precondition check before abrir_ypt. The usage context can be inferred but is never stated.

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

tocar_pastaB

Toca no VLC do PC as músicas e vídeos de uma pasta listada em midia.json (pelo nome), em ordem ou aleatório, em loop.

NameRequiredDescriptionDefault
pastaYesNome da pasta como está em midia.json.
aleatorioNoEmbaralhar a ordem.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, closed-world), so the description only needs to add playback-specific behavior, and it does: the target app is VLC on the PC, playback loops, and order vs shuffle is selectable. It does not say what happens to media already playing, whether VLC must be running, or what the call returns, which are the gaps an agent would actually hit.

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 that front-loads the action (toca no VLC) and then the scope. Every clause carries information; it could only be improved by adding a short clause on prerequisites or failure behavior rather than by cutting anything.

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 two-parameter control tool with no output schema, the description covers what is played, where, and with what ordering or looping, which is close to sufficient. It omits what an agent most needs before calling: whether existing playback is interrupted, what happens if the folder is missing from midia.json, and whether the call returns before or after playback starts.

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%, so both parameters are already documented in the schema, and the description only restates them at a high level ('pelo nome' for pasta, 'em ordem ou aleatório' for aleatorio). It adds no exact-match rules, case sensitivity, or error behavior for an unknown folder name, 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?

The description gives a specific verb and resource chain: it starts playback in VLC of the songs and videos of one folder, identified by name from midia.json. That VLC/local-folder scope implicitly separates it from the sibling abrir_soundcloud, but it never names a sibling or states the contrast explicitly, so it stops short of a 5.

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: the agent can infer a prerequisite (the folder must already be listed in midia.json) and that this is the way to start sequential or shuffled playback. There is no statement of when not to use it, nor any pointer to controle_midia or midia_status for pausing, skipping, or inspecting state.

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 updatesv1.1.0
    • First observedabrir_soundcloud
    • First observedabrir_ypt
    • First observedcontrole_midia
    • First observedmidia_status
    • First observedstatus
    • First observedtocar_pasta

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

The tools mostly target distinct actions: phone status vs. media folder status, opening YPT vs. opening SoundCloud, and starting folder playback vs. sending media keys. The only mild overlap is between tocar_pasta and controle_midia, but their descriptions make the boundary clear enough.

Naming Consistency3/5

All names are snake_case and in Portuguese, but the set mixes verb-first names (abrir_ypt, tocar_pasta, abrir_soundcloud) with noun-first names (status, midia_status, controle_midia). The convention is readable but not predictable.

Tool Count5/5

Six tools is a well-scoped size for this small personal automation server. Each tool covers a distinct operation without obvious filler.

Completeness4/5

The surface covers checking the phone, opening YPT, inspecting media folders, playing a folder, opening SoundCloud, and controlling playback. Minor gaps exist, such as no dedicated stop/next/previous or configuration tool, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    It enables MCP-compatible AI clients to run local device, filesystem, shell, PowerShell, Git, browser, HTTP, clipboard and application actions on a Windows PC and a paired Android phone, with session-based device routing. Sensitive operations are gated behind configurable one-use approvals and recorded in a local SQLite audit.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP-compatible AI assistants to see and control Android devices through ADB and a fast device-control protocol, including screenshots, touch input, typing, app management, UI inspection, file transfer, shell commands, and audio/video streaming.
    365 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects MCP-compatible AI assistants to Android devices, letting them see the screen and act on it through screenshots, taps, swipes, typing, app and UI management, shell commands, file transfer, and clipboard access. It routes interaction through scrcpy's control protocol for fast input and near-instant screen captures, falling back to ADB when no session is active, and adds audio/video streaming and recording.
    365 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Gives AI agents vision and control over Android devices through ADB and scrcpy, enabling screenshots, taps, swipes, typing, app and UI automation, file transfer, shell commands, and audio/video streaming. Works with any MCP-compatible assistant and falls back to ADB-only interaction when scrcpy is unavailable.
    365 npm
    MIT