dsh-plugin-x-profile-reader
No description
- Stars
- 0
- Language
- JavaScript
- Created
- Sep 4, 2026
- Updated
- Sep 4, 2026
Introduction
dsh-plugin-x-profile-reader
A DeepSeek Harness (DSH) plugin that adds the x_profile_read tool: read one X (Twitter) user's public profile and recent posts through the Apify third-party scraper, normalized into a factual, structured result.
Built for the x-outreach-agent preset, but mountable by any preset that adds the tool row.
Data source: this plugin scrapes X through a third-party actor (
patient_discovery/twitter-user-tweets) — not the official X API. Public, login-free data only. See Data source.
Prerequisites
- A DeepSeek Harness profile.
- An Apify account and an API token (
apify.com→ Settings → Integrations → API token).
Install
dsh plugin --profile <name> add dsh-plugin-x-profile-reader
# or from a local checkout:
dsh plugin --profile <name> add ./path/to/dsh-plugin-x-profile-reader
Configure your own API key
The plugin reads its credential from the harness credential store under the ref APIFY_TOKEN (configurable via tokenRef). No key is bundled in this package — every user supplies their own.
Simplest path — export it before launching:
export APIFY_TOKEN=apify_api_your_token_here
dsh web
You can also store it through the harness credential settings; either way the value is resolved at call time and never written into the plugin.
Mount the tool in a preset
Add one row to the preset's agent.cordis.yml:
- id: tool-x-profile
name: dsh-plugin-x-profile-reader
config: # optional
actorId: XSXdgwgBakXd5vRxB # default Apify actor
tokenRef: APIFY_TOKEN # default credential ref
The row consumes host credentials + subprocess and publishes no service, so it needs no isolate realm.
Usage
Call the x_profile_read tool:
| input | type | default | notes |
|---|---|---|---|
username | string (required) | — | handle without @, or a profile URL |
lookbackDays | integer | 30 | clamped 1–30 |
maxPosts | integer | 20 | clamped 1–100 |
includeReplies | boolean | false | best-effort (source has no explicit reply flag) |
includeReposts | boolean | false | excludes RT @ posts when false |
Output:
{ ok, user, posts[], meta, dataMissing[], restrictions[] }
user— public profile (id, username, name, avatar, verified, followers, …).posts[]— normalized posts, each withtext,url,publishedAt,type(original/reply/repost), and availablemetrics.dataMissing[]/restrictions[]— explicit missing-data and permission/rate-limit notes.
The tool returns factual data only — it does not infer topics or sales intent; that synthesis belongs to the agent/preset layer.
Data source
- Actor:
patient_discovery/twitter-user-tweets(userId+maxPages). - Public, login-free scraping — not the official X API.
- Known limits: profile fields are partial (
bio/location/joined/following/tweet-count unavailable), and there is no explicit reply flag. - Respect X's terms and rate limits; use responsibly.