Message From Aliens MCP
An MCP server for Message From Aliens, a game about deciphering a pictographic alien language. Let a model read the current page, inspect character shapes, click characters, and save your annotations.
Reading, clicking, and annotating work in the background without moving the system mouse or activating the game window. Launching the game may bring Steam or the new game window to the foreground.
Requirements
- Windows x64. Linux and macOS are not supported.
- An installed copy of Message From Aliens on Steam, with Steam available and signed in.
- uv for the recommended setup, and an MCP client that supports local stdio servers.
- Python 3.10 or later; uv can provision a compatible interpreter when needed.
- Run the server as the same Windows user and at the same privilege level as the game.
- Screenshot mode requires Windows.Graphics.Capture support and a visible, non-minimized game window. Image results require an MCP client and model that support image content; table, ASCII, and path results are plain text.
The game integration has been verified with the Windows x64 IL2CPP build using
Unity 6000.6.6f1. Game updates may require integration changes.
Setup
After the package is published to PyPI, add this stdio server configuration to your MCP client:
{
"mcpServers": {
"message-from-aliens": {
"command": "uvx",
"args": ["message-from-aliens-mcp"]
}
}
}
Restart or reconnect the MCP client after changing its configuration. If it
cannot find uvx, use the absolute path to uvx.exe as command.
uvx installs the package and dependencies into an isolated environment on demand;
a separate pip install is unnecessary. To pin a published version, use
"args": ["message-from-aliens-mcp==0.1.0"].
To try the server from a source checkout before publication:
uv run message-from-aliens-mcp --help
For a persistent installation after publication:
uv tool install message-from-aliens-mcp
The aliens-mcp command remains available as a compatibility alias.
Tools
All grid coordinates are zero-based: rows 0..8 run from top to bottom, and
columns 0..23 run from left to right.
| Tool | Purpose |
|---|---|
launch_game() |
Start the game through Steam, or connect to an existing instance. |
look(type="table", force=False) |
Read the current 9x24 grid with annotations and layout markers. |
look(type="screenshot", force=False) |
Capture the game window as a PNG, with pixel dimensions and window style. |
click(row, col, type="left") |
Click a character with the left or right button; return the target and outcome. |
note(row, col, text) |
Save an annotation for every occurrence of the selected character. |
glyph(hash, format="image") |
Inspect a character as a PNG, ASCII art, or coordinate paths. |
Reading and identifying characters
Table cells use hash:annotation, such as abcd:my note. Hashes contain four
lowercase letters or digits. The same character keeps its hash across pages in
the current connection. After a reconnect or game restart, call look again to
obtain current hashes.
The table preserves dividers and marks underlines with \underline{...},
highlights with \hl{...}, dim text with \dim{...}, and frames with [...].
Annotations reflect the game's live text, including automatic number and unit
translations when enabled.
Table and screenshot modes keep separate in-memory caches. Each call reads the
current state; an identical result produces a short unchanged message instead
of repeating the content. Use force=True to request the full result.
Screenshots capture only the game window, including its borders when present.
An occluded window can be captured without activating or resizing it. Use table
coordinates for click and note.
Clicking and annotating
Choose coordinates from the current table. click accepts type="left" or
type="right" and reports its target in the same format as look. Call look
after an interaction to inspect the new page. Empty or inactive cells are
rejected. Background clicks with an unfocused window have been verified;
minimized-window clicking has not been separately verified.
If a click requests external navigation, the server returns the requested URLs
and prevents that click from opening a browser. If the game closes, the result
directs the model to launch_game(). The MCP server remains available.
note updates all occurrences across pages and saves through the game's normal
annotation handler. Text must be one line of at most 49 UTF-16 units. An empty
string clears the annotation.
Character shapes
glyph accepts a hash from the current look and returns one selected format:
"image"(default): a PNG drawn from the game's vector geometry, without a screenshot. Resolution adapts from 512 to 2048 pixels square."ascii": spaces and#on an adaptive grid, at least 10x10 and capped at 121 rows by 241 columns. Display it in a monospaced font. Very close strokes may merge at the size cap."paths": JSON polylines fitted proportionally into a 100x100 coordinate range. The origin is top-left, x increases right, and y increases down. Connect consecutive points within each path only. A repeated first point closes the path; a single point is a dot. These are drawing paths, not a writing stroke order.
Character shapes and tables do not expose the game's internal word keys or meanings.
Troubleshooting
| Problem | Action |
|---|---|
| The game is not running | Call launch_game(). Other tools do not start it automatically. |
| Launch times out | Check that Steam is signed in and the game can launch normally, then retry. |
| The server cannot attach | Check the Windows user and privilege level of both processes. |
| Screenshot fails while minimized | Restore the game window. It can remain behind other windows. |
| Images are missing in the client | Use table mode and glyph(format="ascii") or glyph(format="paths"). |
| A hash is unknown after reconnecting | Read a fresh table with look. |
| Frida cannot write its temporary files | Set ALIENS_MCP_TMP to a writable directory in the server environment. |
Development
From a source checkout:
uv sync
uv run python -B -m unittest discover -s tests -v
uv run message-from-aliens-mcp --status
uv run message-from-aliens-mcp --look
Without CLI options, the command serves MCP over stdio. --status checks the
game connection; --look prints the current table. --look --json prints JSON.
--look --raw exposes internal word keys for development and can spoil puzzles.
See runtime notes for implementation details and release checks for compatibility tests and publication.
License
MIT; see LICENSE. This is an unofficial integration. Game assets, decompiled game code, saves, and player annotation files are not distributed. The server instruments the running game with Frida and does not patch game files.
Metadata
Release files for message-from-aliens-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| message_from_aliens_mcp-0.1.0.tar.gz | 44.8 kB | Without provenance | Details for message_from_aliens_mcp-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| message_from_aliens_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for message_from_aliens_mcp-0.1.0-py3-none-any.whl |
Total release size: 76.6 kB
Release files / message_from_aliens_mcp-0.1.0.tar.gz
| Download URL | message_from_aliens_mcp-0.1.0.tar.gz |
|---|---|
| Size | 44.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
53a37df720abf5562846eb07097975ff6b34f10333d22212e850fd700362e8fb
|
|
BLAKE2b-256 checksum How to use checksums |
667422ce21700929dd8a8721f8f80be143692390c37f86673b5d039823d8c787
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.15
|
Release files / message_from_aliens_mcp-0.1.0-py3-none-any.whl
| Download URL | message_from_aliens_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 31.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7c7d80f2e50d483f76625afb78bd0662be4a55c97b6cec5227101ab700d69ea3
|
|
BLAKE2b-256 checksum How to use checksums |
57bfa944a68297a28ebd9c9f96f62e056a0cf1d8aabda255f4cf67b6a3f69dd5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.15
|
Security for message-from-aliens-mcp 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.