systemprompt-mcp-reddit
Version:
A specialized Model Context Protocol (MCP) server that enables you to search, read, and interact with Reddit content, leveraging an AI Agent to help with each operation.
156 lines (155 loc) • 4.95 kB
TypeScript
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
import { RedditService } from "../../services/reddit/reddit-service.js";
import { SystemPromptService } from "../../services/systemprompt-service.js";
import { RedditErrorType } from "../../types/reddit.js";
import { JSONSchema7 } from "json-schema";
export interface ToolHandlerContext {
redditService: RedditService;
systemPromptService: SystemPromptService;
}
export type ToolHandler<T = any> = (args: T, context: ToolHandlerContext) => Promise<CallToolResult>;
export interface ToolResponse<T = any> {
status: "success" | "error";
message: string;
result?: T;
error?: {
type: RedditErrorType | string;
details?: any;
};
}
export declare function formatToolResponse<T>(response: Partial<ToolResponse<T>> & Pick<ToolResponse<T>, "message"> & {
schema?: JSONSchema7;
type: "api" | "server" | "sampling";
title?: string;
}): CallToolResult;
export interface RedditSubredditConfig {
name: string;
description?: string;
tags?: string[];
}
export interface RedditPreferences {
defaultSort?: "hot" | "new" | "top" | "rising" | "controversial";
timeFilter?: "hour" | "day" | "week" | "month" | "year" | "all";
contentFilter?: "all" | "posts" | "comments";
nsfwFilter?: boolean;
minimumScore?: number;
maxPostsPerRequest?: number;
}
export interface FetchRedditContentArgs {
sortBy: "hot" | "new" | "top" | "rising" | "controversial";
timeFilter?: "hour" | "day" | "week" | "month" | "year" | "all";
limit?: number;
subreddits?: string;
}
export interface GetChannelPostsArgs {
sort: "hot" | "new" | "controversial";
subreddit: string;
}
export interface GetPostArgs {
id: string;
}
export interface GetNotificationsArgs {
filter?: "all" | "unread" | "messages" | "comments" | "mentions";
limit?: number;
markRead?: boolean;
excludeIds?: string[];
excludeTypes?: Array<"comment_reply" | "post_reply" | "username_mention" | "message" | "other">;
excludeSubreddits?: string[];
after?: string;
before?: string;
}
export interface DeleteNotificationArgs {
notificationId: string;
}
export interface AnalyseSubredditArgs {
subreddit: string;
}
export interface ConfigureInstructionsArgs {
content: string;
}
export interface CreateRedditPostArgs {
/** Subreddit to post to */
subreddit: string;
/** Instructions for generating the post content */
content: string;
}
export interface CreateRedditCommentArgs {
/** Subreddit where the reply will be posted */
subreddit: string;
/** Instructions for generating the reply content */
content: string;
/** ID of the parent post/comment to reply to */
id: string;
}
export interface SendPostArgs {
/** ID of the parent post/comment being responded to */
id: string;
/** Subreddit to post to (without r/ prefix) */
subreddit: string;
/** Post title (1-300 characters) */
title: string;
/** Text content for self posts */
content?: string;
flair_id?: string;
/** Flair text if the subreddit requires it */
flair_text?: string;
/** Whether to send replies to inbox */
sendreplies?: boolean;
/** Whether to mark as NSFW */
nsfw?: boolean;
/** Whether to mark as spoiler */
spoiler?: boolean;
}
export interface SearchRedditArgs {
query: string;
subreddit?: string;
sort?: "relevance" | "hot" | "new" | "top";
time?: "hour" | "day" | "week" | "month" | "year" | "all";
limit?: number;
}
export interface GetCommentArgs {
id: string;
includeThread?: boolean;
}
export interface SendReplyArgs {
/** The ID of the parent post or comment to reply to (must start with t1_ for comments or t3_ for posts) */
id: string;
/** The markdown text of the reply (max 10000 characters) */
text: string;
/** Whether to send reply notifications */
sendreplies?: boolean;
}
export interface DeleteContentArgs {
/** The ID of the resource to delete */
id: string;
}
export interface EditContentArgs {
/** The ID of the resource to edit */
id: string;
/** The new content for the resource */
content: string;
}
export interface SendCommentArgs {
/** The ID of the post or comment to reply to */
id: string;
/** The content of the comment */
content: string;
/** Whether to send replies to inbox */
sendreplies?: boolean;
}
export interface CreateRedditMessageArgs {
/** The username of the recipient */
recipient: string;
/** The subject of the message */
subject: string;
/** The content of the message */
content: string;
}
export interface SendMessageArgs {
/** Username of the recipient */
recipient: string;
/** Subject line of the message (1-100 chars) */
subject: string;
/** Message content in markdown format (max 10000 chars) */
content: string;
}