x-use 2.4.0 — search_profile, MCP prompts and resources
Adds a read-only profile-timeline tool, the prompt and resource surfaces of the MCP protocol, and a root SKILL.md. Also fixes a version drift that had the package reporting 2.0.0 to external scanners since the v2.0 release.
Added
search_profile, a read-only tool for one profile's recent posts. 32 to 33 tools. The scraper could already read profile timelines, but the only tool that reached that path was run_cycle, which is the one tool with no draft gate in front of it. Watching a competitor should not require the ungated batch path.
profile accepts a handle (@nasa or nasa), a profile URL, or a tweet URL, which resolves to its author. The handle is validated against X's charset and a canonical https://x.com/<handle> is rebuilt from it, so query strings, fragments, and extra path segments are discarded rather than navigated. Foreign hosts and x.com app routes (/home, /i, /search) error before a browser starts.
It also closes a gap in performance tracking: nothing reported how a published post did, because approve_draft returns no URL. Re-reading your own timeline is the answer.
MCP prompts. Five workflow prompts: research_niche, draft_replies, review_and_publish, daily_check, setup_account. The bundled SKILL.md pack only works in clients that implement Agent Skills; prompts are the protocol-native equivalent and work anywhere, including Claude Desktop, Cursor, and Windsurf, with nothing installed. draft_replies is lane-aware, because drafts and queued items live in separate stores with no bridge between them.
MCP resources. Four read-only context surfaces: xuse://accounts, xuse://accounts/{account_id}, xuse://accounts/{account_id}/persona, and xuse://drafts/pending. None start a browser, and all run the same masking as the tools. The persona resource is the point: it is exactly the context a drafting turn needs, and attaching it costs no turn.
SKILL.md at the repository root, generated by scripts/sync_skills.py from the canonical router skill plus an install footer, with a CI drift guard so it stays a mirror rather than a hand-edited copy.
Fixed
The package reported version 2.0.0. src/xuse/__init__.py had been stale since the v2.0 release because nothing inside the package read it. External directory scanners do, and listed x-use as 2.0.0 next to a 2.3.1 release. The version now lives in exactly one place and pyproject.toml derives its own from it, so a second literal cannot reintroduce the drift.
The MCP handshake advertised the SDK's version as x-use's. FastMCP takes no version argument, so the wrapped low-level server's stayed None and every client was told x-use was "1.28.1".
Upgrade
pip install --upgrade x-use-mcpNo configuration changes and no breaking changes. 670 tests, none of which need a network or a browser.
Note for contributors: the release rule changed. Bump __version__ in src/xuse/__init__.py, not pyproject.toml, which now derives its version from that attribute.