insodimension/reddit
v0.1.3MIT
Reddit connector — feeds, posts, comments, search, submit, vote, and inbox via the Reddit OAuth API
What this package declares
The file a client reads when it loads this plugin, exactly as this revision carries it.
plugin.json
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "reddit",
"version": "0.1.3",
"description": "Reddit connector — feeds, posts, comments, search, submit, vote, and inbox via the Reddit OAuth API",
"author": {
"name": "Dimension"
},
"license": "MIT",
"keywords": [
"reddit",
"social",
"forum",
"news",
"connector"
],
"extensions": {
"ai.insodimension.dimension": {
"contractVersion": 1,
"title": "Reddit",
"icon": "assets/icon.svg",
"category": "connector",
"defaultEnabled": false,
"examples": [
"Show me the top posts in r/programming this week",
"Summarize the discussion on this Reddit thread and draft a reply for me to approve",
"Search r/rust for posts about async traits from the last month"
],
"connect": {
"kind": [
"form"
],
"setup": [
{
"title": "Create a Reddit \"script\" app",
"detail": "Go to reddit.com/prefs/apps (logged in as the account the agent will act as), scroll to the bottom, and click \"create another app…\". Give it a name (e.g. \"Dimension\"), and choose the \"script\" app type — script apps are for personal use by their own developer, which is exactly this connector.",
"url": "https://www.reddit.com/prefs/apps",
"urlLabel": "Open Reddit app preferences"
},
{
"title": "Set a redirect URI (required, unused)",
"detail": "In the \"redirect uri\" field enter http://localhost:8080 — script apps never redirect, but the form won't submit without a value. Leave \"about url\" blank. Click \"create app\"."
},
{
"title": "Copy the client ID and secret",
"detail": "After creating the app, the client ID is the short string shown directly UNDER the app name (labelled \"personal use script\"), and the \"secret\" is the longer string on the \"secret\" line. Copy both into the form below."
},
{
"title": "Enter your Reddit username and password",
"detail": "Script apps authenticate with the developer's own Reddit login (OAuth2 password grant). Enter the SAME account that owns the app. If your account has two-factor auth on, append the 6-digit code to your password as password:123456 when connecting. Credentials stay on this machine and are never logged."
}
],
"form": [
{
"id": "clientId",
"label": "Client ID",
"help": "The short string under your app's name on reddit.com/prefs/apps (labelled \"personal use script\").",
"helpUrl": "https://www.reddit.com/prefs/apps",
"helpUrlLabel": "Open Reddit app preferences"
},
{
"id": "clientSecret",
"label": "Client secret",
"secret": true,
"help": "The \"secret\" string shown for your script app on reddit.com/prefs/apps.",
"helpUrl": "https://www.reddit.com/prefs/apps",
"helpUrlLabel": "Open Reddit app preferences"
},
{
"id": "username",
"label": "Reddit username",
"placeholder": "your_username",
"help": "Your Reddit username WITHOUT the u/ prefix — must be the same account that created the script app above. Also used to build the required User-Agent header."
},
{
"id": "password",
"label": "Reddit password",
"secret": true,
"help": "Your Reddit account password. If 2FA is enabled, append the current 6-digit code as password:123456. Stored only on this machine; never logged."
}
],
"configTemplate": "connect/token.template.json",
"configTarget": "~/.config/dimension-reddit/token.json"
},
"toolRenderer": [
{
"match": "reddit_my_feed",
"use": "summary",
"icon": "reddit",
"title": "Reddit feed"
},
{
"match": "reddit_subreddit_posts",
"use": "summary",
"icon": "reddit",
"title": "Subreddit posts"
},
{
"match": "reddit_read_post",
"use": "summary",
"icon": "reddit",
"title": "Reddit post"
},
{
"match": "reddit_search",
"use": "summary",
"icon": "reddit",
"title": "Reddit search"
},
{
"match": "reddit_submit_post",
"use": "summary",
"icon": "reddit",
"title": "Submit post"
},
{
"match": "reddit_comment",
"use": "summary",
"icon": "reddit",
"title": "Reddit comment"
},
{
"match": "reddit_vote",
"use": "summary",
"icon": "reddit",
"title": "Reddit vote"
},
{
"match": "reddit_inbox",
"use": "summary",
"icon": "reddit",
"title": "Reddit inbox"
},
{
"match": "reddit_reply_message",
"use": "summary",
"icon": "reddit",
"title": "Reddit reply"
},
{
"match": "reddit_my_profile",
"use": "summary",
"icon": "reddit",
"title": "Reddit profile"
}
],
"skillCard": {
"skill": "reddit",
"use": "summary",
"icon": "reddit",
"title": "Reddit"
},
"tools": [
{
"name": "reddit_my_feed",
"description": "Read the connected account's home feed (subscribed subreddits). sort = best|hot|new|top|rising. Returns fullname/subreddit/score/comments/author/title per line; paginate with the returned 'after' cursor."
},
{
"name": "reddit_subreddit_posts",
"description": "List posts in a subreddit. Takes subreddit (without r/), sort = hot|new|top|rising|controversial, and time (hour|day|week|month|year|all) for top/controversial. Returns fullname/score/comments/author/title per line; paginate with 'after'."
},
{
"name": "reddit_read_post",
"description": "Read a post and its comment tree, flattened with indentation and truncated for scanning. Takes the post id or t3_ fullname (from a feed/search line) and optional subreddit + sort (best|top|new|controversial|qa). Returns the post body then comments."
},
{
"name": "reddit_search",
"description": "Search Reddit posts. Takes query; optional subreddit (without r/) to scope, sort (relevance|hot|top|new|comments), and time (hour|day|week|month|year|all). Returns fullname/subreddit/score/comments/title per line; paginate with 'after'."
},
{
"name": "reddit_submit_post",
"description": "Submit a post to a subreddit — a self (text) post or a link. DESTRUCTIVE — this publishes publicly; ALWAYS confirm the subreddit, title, and body/url with the user first. Returns the new post's id and url."
},
{
"name": "reddit_comment",
"description": "Comment on a post or reply to another comment. Takes the parent t3_ (post) or t1_ (comment) fullname and text. DESTRUCTIVE — this publishes publicly; ALWAYS confirm the parent and text with the user first. Returns the new comment id."
},
{
"name": "reddit_vote",
"description": "Vote on a post or comment. Takes the t3_/t1_ fullname and dir = up|down|clear. WRITE — cast ONLY votes the user explicitly asked for; Reddit's rules forbid vote manipulation and automated/directed voting. Confirm the target and direction first."
},
{
"name": "reddit_inbox",
"description": "Read the connected account's message inbox. box = inbox|unread|messages|comments|mentions. Returns id/from/subject/snippet per line — the id (a t4_/t1_ fullname) is what reddit_reply_message replies to."
},
{
"name": "reddit_reply_message",
"description": "Reply to a private message or inbox item. Takes the t4_ (message) or t1_ (comment reply) fullname from reddit_inbox and text. DESTRUCTIVE — sends a real message; ALWAYS confirm the recipient/thread and text with the user first."
},
{
"name": "reddit_my_profile",
"description": "Show the connected account's profile — username, karma (link/comment), account age, and unread-mail flag. Read-only; useful to confirm which account the connector is acting as."
}
]
}
}
}
Client extensions
Data this package carries for particular clients. The directory lists the clients named and never reads what is addressed to them.
- ai.insodimension.dimension